???? 本文主要是讓我們了解比特幣中所用到的Hash(SHA-256)算法.我們從什么是Hash,常見的哈希算法有那些,當前主流使用的哈希算法是什么,哈希算法的性能及安全和建議,最后我們看C#怎么實現SHA-256算法。
Hash定義及是什么:
???? Hash(哈希或散列)算法是非?;A也非常重要的計算機算法,它能將任意長度的二進制明文映射為較短的(通常是固定長度的)二進制Hash值,并且不同的明文很難映射為相同的Hash值。
???? 例如:SHA-256(123456)=8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
SHA-256(我們今天來看看比特幣使用的Hash(SHA-256)算法)=4208d006395df44386329cd5720040f5bff4f34b57b78e39f879f4ca94c3ad94
????? 以上兩個例子,第一個(123456)例子和第二個(我們今天來看看比特幣使用的Hash(SHA-256)算法)例子,通過哈希(SHA-256)算法把不同長度的明文字符映射為固定長度字符。也就是說只要是SHA-256計算后的結果為:8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92,則說明該內容極大概率上就是(123456).
常見的Hash算法及主流使用算法是:
???? 目前常見的Hash算法包括MD5和SHA(SHA-1、SHA-2、SHA-3).
???? MD4(RFC 1320)是MIT的Ronald L.Rivest在1990年設計的,MD是Message Digest的縮寫。其輸出為128位。MD4已被證明不夠安全。
???? MD5(RFC 1321)是Rivest于1991年對MD4的改進版本。它對輸入仍以512位進行分組,其輸出是128位。MD5比MD4更加安全,但是過程更加復雜,計算速度也慢一些。MD5已被證明不具備”強抗碰撞性”。
???? SHA(Secure Hash Algorithm)并非一個算法,而是一個Hash函數族。NIST(NationalInstitute of Standards andTechnology)于1993年發(fā)布其首個實現。知名的SHA-1算法1995年面世,它輸出長度160位的Hash值,抗窮舉性更好。SHA-1設計模仿了MD4算法,采用類似原理。SHA-1已被證實不具備“強扛碰撞性”。
????? 為了提高安全性,NIST還設計出了SHA-224、SHA-256、SHA-384和SHA-512算法(SHA-2),跟SHA-1算法原理類似。SHA-3相關算法也已經被提出。
???? 現在還是有很多系統采用的MD5和SHA-1算法,但是這些算法已經不安全了,一般現在推薦至少使用SHA-256或更安全的算法。
性能及安全和建議:
?????? Hash算法一般都是計算敏感型的。也意味著計算資源是瓶頸,主頻越高的CPU運行Hash算法速度越快。因此可以通過硬件加速來提升Hash計算的吞吐量。也有一些Hash算法不是計算敏感型的。例如scrypt算法,計算過程需要大量內存資源,節(jié)點不同通過簡單地添加更多CPU來獲得Hash性能提升。這樣的Hash算法經常用來避免算力攻擊的常景。
????? Hash算法不是一種加密算法,不能用于對信息的保護,但是Hash算法暢用于對口令的保存上。例如用戶登錄網站需要通過用戶名口令來驗證。如果網站后臺數據庫直接保存用戶口令的明文,一旦數據庫發(fā)生泄漏后果不堪設想。
????? 利用Hash的特性,后臺可以僅保存密碼的Hash值,這樣只要比對Hash值一致,則說明輸入的口令正確,及時數據庫泄露了,也無法從Hash值還原口令,只能進行窮舉測試。
????? 由于用戶設置的口令的強度不夠,只是簡單字符串,例如上面我們說的password、123456、654321或者生日等。有人通過這些口令,計算對應的Hash值,制作對應的哈希值庫。這樣通過Hash值可以快速反查原始口令。
????? 為了防范這一類攻擊,我們建議不要用簡單的口令及個人生日作為口令,現今個人身份信息很容易得到,以上是個人建議。
????? 如果是網站或者說是系統,可以采用在口令基礎上添加隨機數后進行Hash且隨機數存放在不同的地方,這樣只要不是兩者同事泄露,攻擊者就很難破解。
最后我們用C#方式展示SHA-256算法:
首先我們需要引用類:
usingSystem.Security.Cryptography
聲明字節(jié)數組來接收需要序列化的字符串:
byte[] bytValue =System.Text.Encoding.UTF8.GetBytes(“123456”);
然后調用Hash(SHA-256),傳入字節(jié)數組:
SHA256 sha256 = newSHA256CryptoServiceProvider();
聲明字節(jié)數組接收已經哈希的值:
byte[] retVal =sha256.ComputeHash(bytValue);
以上是我們談的內容,如果需要深入了解,哪我們感覺行動吧!