中文字幕日韩一区二区_国产一区二区av_国产毛片av_久久久久国产一区_色婷婷电影_国产一区二区精品

哈希(Hash)與加密(Encrypt)的基本原理、區(qū)別及工程應(yīng)用

  0、摘要

      今天看到吉日嘎拉一篇關(guān)于管理軟件中信息加密和安全的文章,感覺非常有實(shí)際意義。文中作者從實(shí)踐經(jīng)驗(yàn)出發(fā),討論了信息管理軟件中如何通過哈希和加密進(jìn)行數(shù)據(jù)保護(hù)。但是從文章評(píng)論中也可以看出很多朋友對(duì)這個(gè)方面一些基本概念比較模糊,這樣就容易“照葫蘆畫瓢”,不能根據(jù)自身具體情況靈活選擇和使用各種哈希和加密方式。本文不對(duì)哈希和加密做過于深入的討論,而是對(duì)哈希和加密的基本概念和原理進(jìn)行闡述、比較,并結(jié)合具體實(shí)踐說明如何選擇哈希和加密算法、如何提高安全性等問題,使朋友們做到“知其然,知其所以然”,這樣就能通過分析具體情況,靈活運(yùn)用哈希和加密保護(hù)數(shù)據(jù)。

  1、哈希(Hash)與加密(Encrypt)的區(qū)別

      在本文開始,我需要首先從直觀層面闡述哈希(Hash)加密(Encrypt)的區(qū)別,因?yàn)槲乙娺^很多朋友對(duì)這兩個(gè)概念不是很清晰,容易混淆兩者。而正確區(qū)別兩者是正確選擇和使用哈希與加密的基礎(chǔ)。

      概括來說,哈希(Hash)是將目標(biāo)文本轉(zhuǎn)換成具有相同長(zhǎng)度的、不可逆的雜湊字符串(或叫做消息摘要),而加密(Encrypt)是將目標(biāo)文本轉(zhuǎn)換成具有不同長(zhǎng)度的、可逆的密文。

      具體來說,兩者有如下重要區(qū)別:

      1、哈希算法往往被設(shè)計(jì)成生成具有相同長(zhǎng)度的文本,而加密算法生成的文本長(zhǎng)度與明文本身的長(zhǎng)度有關(guān)。

      例如,設(shè)我們有兩段文本:“Microsoft”和“Google”。兩者使用某種哈希算法得到的結(jié)果分別為:“140864078AECA1C7C35B4BEB33C53C34”和“8B36E9207C24C76E6719268E49201D94”,而使用某種加密算法的到的結(jié)果分別為“Njdsptpgu”和“Hpphmf”。可以看到,哈希的結(jié)果具有相同的長(zhǎng)度,而加密的結(jié)果則長(zhǎng)度不同。實(shí)際上,如果使用相同的哈希算法,不論你的輸入有多么長(zhǎng),得到的結(jié)果長(zhǎng)度是一個(gè)常數(shù),而加密算法往往與明文的長(zhǎng)度成正比。

      2、哈希算法是不可逆的,而加密算法是可逆的。

      這里的不可逆有兩層含義,一是“給定一個(gè)哈希結(jié)果R,沒有方法將E轉(zhuǎn)換成原目標(biāo)文本S”,二是“給定哈希結(jié)果R,即使知道一段文本S的哈希結(jié)果為R,也不能斷言當(dāng)初的目標(biāo)文本就是S”。其實(shí)稍微想想就知道,哈希是不可能可逆的,因?yàn)槿绻赡妫敲垂>褪鞘澜缟献顝?qiáng)悍的壓縮方式了——能將任意大小的文件壓縮成固定大小。

      加密則不同,給定加密后的密文R,存在一種方法可以將R確定的轉(zhuǎn)換為加密前的明文S。

      這里先從直觀層面簡(jiǎn)單介紹兩者的區(qū)別,等下文從數(shù)學(xué)角度對(duì)兩者做嚴(yán)謹(jǐn)描述后,讀者朋友就知道為什么會(huì)有這兩個(gè)區(qū)別了。

  2、哈希(Hash)與加密(Encrypt)的數(shù)學(xué)基礎(chǔ)

      從數(shù)學(xué)角度講,哈希和加密都是一個(gè)映射。下面正式定義兩者:

      一個(gè)哈希算法

      有了以上定義,就很清楚為什么會(huì)存在上文提到的兩個(gè)區(qū)別了。由于哈希算法的定義域是一個(gè)無限集合,而值域是一個(gè)有限集合,將無限集合映射到有限集合,根據(jù)“鴿籠原理(Pigeonhole principle)”,每個(gè)哈希結(jié)果都存在無數(shù)個(gè)可能的目標(biāo)文本,因此哈希不是一一映射,是不可逆的。

      而加密算法是一一映射,因此理論上來說是可逆的。

      但是,符合上面兩個(gè)定義的映射僅僅可以被叫做哈希算法和加密算法,但未必是好的哈希和加密,好的哈希和加密往往需要一些附加條件,下面介紹這些內(nèi)容。

      一個(gè)設(shè)計(jì)良好的哈希算法應(yīng)該很難從哈希結(jié)果找到哈希目標(biāo)文本的碰撞(Collision)。那么什么是碰撞呢?對(duì)于一個(gè)哈希算法H,如果

      對(duì)上圖我想已無需多言,很多朋友應(yīng)該使用過類似的哈希方法進(jìn)行數(shù)據(jù)保護(hù)。當(dāng)前最常用的哈希算法是MD5SHA1,下面給出在.NET平臺(tái)上用C#語言實(shí)現(xiàn)MD5和SHA1哈希的代碼,由于.NET對(duì)于這兩個(gè)哈希算法已經(jīng)進(jìn)行很很好的封裝,因此我們不必自己實(shí)現(xiàn)其算法細(xì)節(jié),直接調(diào)用相應(yīng)的庫函數(shù)即可(實(shí)際上MD5和SHA1算法都十分復(fù)雜,有興趣的可以參考維基百科)。

using System;using System.Web.Security;namespace HashAndEncrypt{    /// <summary>    /// 哈希(Hash)工具類    /// </summary>    public sealed class HashHelper    {        /// <summary>        /// 使用MD5算法進(jìn)行哈希        /// </summary>        /// <param name="source">源字串</param>        /// <returns>雜湊字串</returns>        public static string MD5Hash(string source)        {            return FormsAuthentication.HashPasswordForStoringInConfigFile(source, "MD5");        }        /// <summary>        /// 使用SHA1算法進(jìn)行哈希        /// </summary>        /// <param name="source">源字串</param>        /// <returns>雜湊字串</returns>        public static string SHA1Hash(string source)        {            return FormsAuthentication.HashPasswordForStoringInConfigFile(source, "SHA1");        }    }}


 

  3.3、對(duì)簡(jiǎn)單哈希(Hash)的攻擊

      下面我們討論上述的數(shù)據(jù)保護(hù)方法是否安全。

      對(duì)于哈希的攻擊,主要有尋找碰撞法窮舉法

      先來說說尋找碰撞法。從哈希本身的定義和上面的數(shù)據(jù)保護(hù)原理圖可以看出,如果想非法登錄系統(tǒng),不一定非要得到注冊(cè)時(shí)的輸入口令,只要能得到一個(gè)注冊(cè)口令的碰撞即可。因此,如果能從雜湊串中分析出一個(gè)口令的碰撞,則大功告成。

      不過我的意見是,對(duì)這種攻擊大可不必?fù)?dān)心,因?yàn)槟壳皩?duì)于MD5和SHA1并不存在有效地尋找碰撞方法。雖然我國杰出的數(shù)學(xué)家王小云教授曾經(jīng)在國際密碼學(xué)會(huì)議上發(fā)布了對(duì)于MD5和SHA1的碰撞尋找改進(jìn)算法,但這種方法和很多人口中所說的“破解”相去甚遠(yuǎn),其理論目前僅具有數(shù)學(xué)上的意義,她將破解MD5的預(yù)期步驟數(shù)從2^80降到了2^69,雖然從數(shù)學(xué)上降低了好幾個(gè)數(shù)量級(jí),但2^69對(duì)于實(shí)際應(yīng)用來說仍然是一個(gè)天文數(shù)字,就好比以前需要一億年,現(xiàn)在需要一萬年一樣。

      不過這并不意味著使用MD5或SHA1后就萬事大吉了,因?yàn)檫€有一種對(duì)于哈希的攻擊方法——窮舉法。通俗來說,就是在一個(gè)范圍內(nèi),如從000000到999999,將其中所有值一個(gè)一個(gè)用相同的哈希算法哈希,然后將結(jié)果和雜湊串比較,如果相同,則這個(gè)值就一定是源字串或源字串的一個(gè)碰撞,于是就可以用這個(gè)值非法登錄了。

      例如,下文是對(duì)MD5的窮舉攻擊的代碼(設(shè)攻擊范圍為000000到999999):

using System;using System.Web.Security;namespace HashAndEncrypt{    /// <summary>    /// MD5攻擊工具類    /// </summary>    public sealed class MD5AttackHelper    {        /// <summary>        /// 對(duì)MD5進(jìn)行窮舉攻擊        /// </summary>        /// <param name="hashString">雜湊串</param>        /// <returns>雜湊串的源串或源串碰撞(攻擊失敗則返回null)</returns>        public static string AttackMD5(string hashString)        {            for (int i = 0; i <= 999999; i++)            {                string testString = i.ToString();                while (testString.Length < 6)                    testString = "0" + testString;                if (FormsAuthentication.HashPasswordForStoringInConfigFile(testString, "MD5") == hashString)                    return testString;            }            return null;        }    }}

it知識(shí)庫哈希(Hash)與加密(Encrypt)的基本原理、區(qū)別及工程應(yīng)用,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 91久久精品一区二区二区 | 在线观看国产 | 亚洲精品美女视频 | 久久毛片 | 四虎在线观看 | 国产精品久久久久久久久久 | 伊人精品一区二区三区 | 国产精品久久毛片av大全日韩 | 国产精选一区 | 国产精品视频导航 | 黄色免费网站在线看 | 一级片网址 | 国产精品高清在线 | 日本高清视频在线播放 | h视频在线免费 | 国产欧美性成人精品午夜 | 国产精品久久一区二区三区 | 中文字幕第7页 | 国产精品99一区二区 | 日韩一区精品 | 久久久精品天堂 | 狠狠亚洲 | 成人在线视频免费观看 | 成人精品国产一区二区4080 | 一区二区日本 | 亚洲国产成人av好男人在线观看 | 日日噜 | 综合色久 | 欧美日韩视频在线播放 | 国产a一区二区 | 日韩在线免费视频 | 羞羞的视频免费观看 | 99久久精品国产一区二区三区 | 精品亚洲一区二区 | 91国语清晰打电话对白 | 久久综合久色欧美综合狠狠 | 精品网站999| 成人亚洲性情网站www在线观看 | 日韩精品在线免费观看视频 | 久久一二| 成人精品视频在线观看 |