了解比特幣中所用的Hash算法-SHA-256

???? 本文主要是讓我們了解比特幣中所用到的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);

以上是我們談的內容,如果需要深入了解,哪我們感覺行動吧!

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 轉載自:https://halfrost.com/go_map_chapter_one/ https://half...
    HuJay閱讀 6,473評論 1 5
  • 散列表,它是基于快速存取的角度設計的,也是一種典型的“空間換時間”的做法。顧名思義,該數據結構可以理解為一個線性表...
    yeying12321閱讀 3,770評論 0 6
  • 休息
    ttttttttttt55閱讀 483評論 0 0
  • ElasticSearch是一款非常優(yōu)秀的分布式搜索程序,提供RESTful API,底層基于Lucene,采用多...
    JunChow520閱讀 518評論 0 1
  • 姐姐現在每天早上帶著弟弟一起,表演: 我怎么…這么…好看… 真是太魔性了! 這幾天實在是忙,無暇顧及姐姐,對她的要...
    婕寧捷媽媽閱讀 473評論 0 0

友情鏈接更多精彩內容