???? 本文主要是讓我們了解比特幣中所用到的Hash(SHA-256)算法.我們從什么是Hash卜壕,常見的哈希算法有那些,當(dāng)前主流使用的哈希算法是什么,哈希算法的性能及安全和建議糊昙,最后我們看C#怎么實(shí)現(xiàn)SHA-256算法。
Hash定義及是什么:
???? Hash(哈闲磺或散列)算法是非呈臀基礎(chǔ)也非常重要的計(jì)算機(jī)算法,它能將任意長度的二進(jìn)制明文映射為較短的(通常是固定長度的)二進(jìn)制Hash值回挽,并且不同的明文很難映射為相同的Hash值没咙。
???? 例如:SHA-256(123456)=8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
SHA-256(我們今天來看看比特幣使用的Hash(SHA-256)算法)=4208d006395df44386329cd5720040f5bff4f34b57b78e39f879f4ca94c3ad94
????? 以上兩個(gè)例子,第一個(gè)(123456)例子和第二個(gè)(我們今天來看看比特幣使用的Hash(SHA-256)算法)例子厅各,通過哈希(SHA-256)算法把不同長度的明文字符映射為固定長度字符镜撩。也就是說只要是SHA-256計(jì)算后的結(jié)果為:8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92,則說明該內(nèi)容極大概率上就是(123456).
常見的Hash算法及主流使用算法是:
???? 目前常見的Hash算法包括MD5和SHA(SHA-1队塘、SHA-2袁梗、SHA-3).
???? MD4(RFC 1320)是MIT的Ronald L.Rivest在1990年設(shè)計(jì)的,MD是Message Digest的縮寫憔古。其輸出為128位遮怜。MD4已被證明不夠安全。
???? MD5(RFC 1321)是Rivest于1991年對(duì)MD4的改進(jìn)版本鸿市。它對(duì)輸入仍以512位進(jìn)行分組锯梁,其輸出是128位即碗。MD5比MD4更加安全,但是過程更加復(fù)雜陌凳,計(jì)算速度也慢一些剥懒。MD5已被證明不具備”強(qiáng)抗碰撞性”。
???? SHA(Secure Hash Algorithm)并非一個(gè)算法合敦,而是一個(gè)Hash函數(shù)族初橘。NIST(NationalInstitute of Standards andTechnology)于1993年發(fā)布其首個(gè)實(shí)現(xiàn)。知名的SHA-1算法1995年面世充岛,它輸出長度160位的Hash值蹄咖,抗窮舉性更好赊琳。SHA-1設(shè)計(jì)模仿了MD4算法歧杏,采用類似原理逻澳。SHA-1已被證實(shí)不具備“強(qiáng)扛碰撞性”。
????? 為了提高安全性蒜魄,NIST還設(shè)計(jì)出了SHA-224扔亥、SHA-256、SHA-384和SHA-512算法(SHA-2),跟SHA-1算法原理類似权悟。SHA-3相關(guān)算法也已經(jīng)被提出砸王。
???? 現(xiàn)在還是有很多系統(tǒng)采用的MD5和SHA-1算法,但是這些算法已經(jīng)不安全了峦阁,一般現(xiàn)在推薦至少使用SHA-256或更安全的算法谦铃。
性能及安全和建議:
?????? Hash算法一般都是計(jì)算敏感型的。也意味著計(jì)算資源是瓶頸榔昔,主頻越高的CPU運(yùn)行Hash算法速度越快驹闰。因此可以通過硬件加速來提升Hash計(jì)算的吞吐量。也有一些Hash算法不是計(jì)算敏感型的撒会。例如scrypt算法嘹朗,計(jì)算過程需要大量內(nèi)存資源,節(jié)點(diǎn)不同通過簡單地添加更多CPU來獲得Hash性能提升诵肛。這樣的Hash算法經(jīng)常用來避免算力攻擊的常景屹培。
????? Hash算法不是一種加密算法,不能用于對(duì)信息的保護(hù)怔檩,但是Hash算法暢用于對(duì)口令的保存上褪秀。例如用戶登錄網(wǎng)站需要通過用戶名口令來驗(yàn)證。如果網(wǎng)站后臺(tái)數(shù)據(jù)庫直接保存用戶口令的明文薛训,一旦數(shù)據(jù)庫發(fā)生泄漏后果不堪設(shè)想媒吗。
????? 利用Hash的特性,后臺(tái)可以僅保存密碼的Hash值乙埃,這樣只要比對(duì)Hash值一致闸英,則說明輸入的口令正確锯岖,及時(shí)數(shù)據(jù)庫泄露了,也無法從Hash值還原口令甫何,只能進(jìn)行窮舉測試出吹。
????? 由于用戶設(shè)置的口令的強(qiáng)度不夠,只是簡單字符串辙喂,例如上面我們說的password趋箩、123456、654321或者生日等加派。有人通過這些口令,計(jì)算對(duì)應(yīng)的Hash值跳芳,制作對(duì)應(yīng)的哈希值庫芍锦。這樣通過Hash值可以快速反查原始口令。
????? 為了防范這一類攻擊飞盆,我們建議不要用簡單的口令及個(gè)人生日作為口令娄琉,現(xiàn)今個(gè)人身份信息很容易得到,以上是個(gè)人建議吓歇。
????? 如果是網(wǎng)站或者說是系統(tǒng)孽水,可以采用在口令基礎(chǔ)上添加隨機(jī)數(shù)后進(jìn)行Hash且隨機(jī)數(shù)存放在不同的地方,這樣只要不是兩者同事泄露城看,攻擊者就很難破解女气。
最后我們用C#方式展示SHA-256算法:
首先我們需要引用類:
usingSystem.Security.Cryptography
聲明字節(jié)數(shù)組來接收需要序列化的字符串:
byte[] bytValue =System.Text.Encoding.UTF8.GetBytes(“123456”);
然后調(diào)用Hash(SHA-256),傳入字節(jié)數(shù)組:
SHA256 sha256 = newSHA256CryptoServiceProvider();
聲明字節(jié)數(shù)組接收已經(jīng)哈希的值:
byte[] retVal =sha256.ComputeHash(bytValue);
以上是我們談的內(nèi)容测柠,如果需要深入了解炼鞠,哪我們感覺行動(dòng)吧!