計算機密碼學1_散列算法


我也不是專業的,請帶着思考閱讀.

還有就是,文中的白話,別杠.

關鍵字:

不可逆hash散列

0.背景

接下來討論的幾節內容,是由下面這張圖擴展開來.

image-20211030011847077

1.散列

散列就是不可逆算法的實現.

類似於指紋,每個人都有一個獨特的指紋,人不同,指紋也就不同.

在計算機的世界里,每個文件也可以有自己的一個散列值,字符串、視頻、語音等等都可以轉換成二進制的數據,他們都能擁有自己的散列值,每個文件的散列值同樣可以是獨一無二的.

散列是一種不可逆運算,通過輸入x,通過一定的函數運算,可以得到一個結果y.當x固定時,輸出的y也總是固定的.

日常生活中,像什么hash、不可逆運算等等,你都可以簡單的理解為散列.

它具有以下特點:

  • 固定大小
  • 雪崩效應
  • 單向
  • 沖突避免

2 特點

要設計一個良好的Hash算法,應該滿足以下要求.

2.1 固定大小

不管多大的數據,得出的hash值長度都是一樣的.

看下圖這個漏斗,我們可以形象的理解為,不管多大的東西進去,出來的值總是固定大小的.

不同的散列算法,得出的散列值長度是不一樣的,如MD5為128bit.

image-20211030003434303

2.2 雪崩效應

稍微修改一點,哪怕是小小的1bit,得出的hash值都是截然不同的.

類似於雙胞胎,看起來哪里都一樣,但是指紋確實完全不同的.

2.3 單向

拿着指紋反向推導出這個人,是一件困難的工作.

我們可以通過入參x計算出hash值y,但是反向推導是不可行的,即不能通過hash結果y輕易計算出源數據x.

2.4 沖突避免

對於不同的文件,我們應該盡量確保計算出的hash值是不一樣的.

對於輸入的數據,如果你的hash算法結果很容易一樣,這並不符合我們的要求.

我們要盡量去確保散列算法能避免沖突,但是能完全避免也是不合理的.

以MD5為例,入參是整個宇宙,但是結果總歸只有那么128位,是可能存在入參不同但是hash值卻相同的情況.

3 實例

網上下文件的時候,經常看到后面一個什么MD5值,SHA值,為啥要寫個這個?

下載下來文件后,你可以拿相應的計算工具去計算這個文件的MD5值,如果傳輸過程中文件有損壞/修改,得出的MD5值將會不一樣.

這樣,我們就能確保下載下來的文件跟官網的文件是完全一樣的.

那玩意數據庫里的密碼竟然存的是HASH值?

由於不可逆的特性,你破解數據庫拿到數據后,看到一堆hash值,也很難猜到真實的用戶密碼.

那我存成hash值,怎么知道用戶輸入的明文密碼對不對啊?

拿到密碼計算hash值,跟庫里面的hash值一樣,那不就對了嗎.

4 擴展

由於算法是單向的,我們很難通過hash值反向得出源數據.像上面這個密碼的場景,有心人可以存一個密碼庫.

記錄下常見的"源數據-hash值",我拿着hash值查表,這不把密碼找到了嗎?

所以呀,讓你不要用常見的密碼,給你整個hash騙騙眼睛又怎么樣,hash值都被別人存起來了.

只要咱的庫夠全,你的hash值我也有機會找到.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM