群人各说什么是哈希算法?
這個HASH算法不是大學里數據結構課里那個HASH表的算法。這里的HASH算法是密碼學的基礎,比較常用的有MD5和SHA,最重要的兩條性質,就是不可逆和無沖突。
所謂不可逆,就是當你知道x的HASH值,無法求出x;
所謂無沖突,就是當你知道x,無法求出一個y, 使x與y的HASH值相同。
這兩條性質在數學上都是不成立的。因為一個函數必然可逆,且由于HASH函數的值域有限,理論上會有無窮多個不同的原始值,它們的hash值都相同。MD5和SHA做到的,是求逆和求沖突在計算上不可能,也就是正向計算很容易,而反向計算即使窮盡人類所有的計算資源都做不到。
我覺得密碼學的幾個算法(HASH、對稱加密、公私鑰)是計算機科學領域最偉大的發明之一,它授予了弱小的個人在強權面前信息的安全(而且是絕對的安全)。舉個例子,只要你一直使用https與國外站點通訊,并注意對方的公鑰沒有被篡改,G**W可以斷開你的連接,但它永遠不可能知道你們的傳輸內容是什么。
順便說一下,王小云教授曾經成功制造出MD5的碰撞,即md5(a) = md5(b)。這樣的碰撞只能隨機生成,并不能根據一個已知的a求出b(即并沒有破壞MD5的無沖突特性)。但這已經讓他聲名大噪了。————————————————————————————————————————————————
哈希算法是用來解決數據和數據之間對應關系的一種算法。它的初衷是用來加速數據存取。
計算機領域內的大多數查找算法都與存儲數據的規模呈正相關,用于衡量查找算法效率的量我們稱為平均查找長度,一般情況下,比較優秀的查找算法的平均查找長度也不會短于數據規模以2為底的對數()。
哈希算法中,我們把數據項中的關鍵字用一種特定的對應關系和存儲數據項的地址或地址偏移量對應起來。注意:這種對應一般不是一一對應,因為不可能有足夠多的地址對應近乎無窮多的關鍵字。
這樣一來,當我們知道數據關鍵字的時候,在大多數情況下可以在常數時間(與數據規模無關的常數)內存取這個關鍵字。其他的時候,有可能發生多個關鍵字占據同一地址的現象,我們稱之為碰撞。
碰撞:已知原數據和其MD5值,想找到一個具有相同MD5值的數據(即偽造數據)
這種情況下需要對關鍵字進行二次或更多次的處理(如果發生多次碰撞),所費時間在最差情況下也只與規模成正比。
只要這種函數的對應關系取得足夠好,碰撞就會較少的發生,從而使平均查找長度在數據規模可控的情況下大幅度縮短,從而提高查找效率。
-----------------------------------------------------------------
哈希函數除此以外,也可以用來對廣義上的字符串(例如文本、視頻、圖片、程序等等等等)進行特征驗證。常見的有CRC32(32位循環冗余校驗),從MD2、MD3、MD4發展而來的MD5(消息摘要算法第五版),SHA1(安全哈希算法)等等。
這類哈希算法的最初用途僅僅是對這些廣義字符串進行完整性校驗,因為在傳輸中損壞的比特位往往僅僅是極少數,這些少數的錯誤用上述提到的算法可以得出和原本正確文件截然不同的值,這也就使得文件完整性校驗的開銷得以縮小。
-----------------------------------------------------------------
問題中描述的用途其實并不完全適當,但是在一定程度內可行。
因為訪問的網絡地址有無窮多個,但是所有的哈希算法生成的特征值都有限,在極端情況下,很有可能會出現兩個不同的網絡地址具有相同特征值的情況。
這不僅使得在得知特征值時,反向推測網絡地址具有了可行性(雖然開銷可能極大,需要大量時間窮舉),而且在網絡地址增長速度極快的今天,安全地址可能和危險地址發生碰撞導致誤殺或者錯誤放行的情況(現在雖然可能還沒出現過,但不能排除這種可能性)。
這種哈希算法本身雖然在理論上是不可逆的,但是它的思想保證了它也不是絕對可靠的。 ——————————————————————————————————————————————————
這種函數是一種摘要算法,你給他輸入一個任意長的數據A他給你返回固定長度的數據B,也稱B為“指紋”。
所以理論上來說你拿到一個B你是猜不出來A是什么的。因為B是固定長度的,它對應了無數個A。
舉個更形象點的例子。
這東西其實就像字典(其實就是)。你給出來的字符串是一個單詞,他在字典里面所屬的條目是A-Z其中一個字母。不管你給的單詞有多長,他總屬于字典中某一個目錄下(也就是首字母。。)。你現在有兩個單詞,你不知道他們都是什么,但是你知道一個在“A”里面一個在“E”里面。這樣你就知道這倆肯定不是同樣的單詞。不過由于每個條目下都有一大堆的單詞,所以你還是不知道這兩個單詞具體是什么。
當然也有很大的概率兩個單詞都在E里面,這種情況叫做一種“碰撞”。兩個不同的東西生成了同樣的結果。拿到360的例子上來說就是,你開了家網站,起了個特別詭異的名字,用奇虎的哈希算法算出來的結果和某個不良網站一樣。那么你的網站就被當不良網站屏蔽掉了。
一個好的哈希算法要保證盡可能的少產生碰撞。還是說你之前查字典的例子。這次你把字典拆了。給里面每個首字母下面又加了26個條目,分別是A-Z,里面裝著以這些當結尾的單詞。這樣你隨便挑兩個單詞是一個坑里出來的概率就小多了。
設計一個哈希算法要考慮的有很多。比如你不知道一個單詞具體是什么,但知道首字母是A,但是你也不知道首字母A的單詞都是什么,你得找一堆單詞挨個試。要是算法復雜點你得試個幾十年才能找到符合條件的單詞,雖然可能不是你原來找的那個,但是看起來差不多。那么這算法就成功了。人家拖了你幾十年。
然后突然你有一天覺醒了。感覺就差倆單詞太費勁了。所以你買了本空字典,把天下單詞挨個試一遍,終于把所有目錄里面都填滿了。然后你以后找單詞就很方便了。別人給你一個單詞首字母是A,你就隨便從A里面找個應附上。雖然不知道是不是他說的那個,但至少看起來是一個坑里出來的就過關了。這字典就叫彩虹表。這東西寫起來比較耗時。沒準你算了二十年發現試過的那些單詞首字母全是XYZ,但是人家每次給的都是ETA,那之前的活都白干了。
雖然這種方法得到的不是原始記錄,而僅僅是與之具有相同特征的記錄。而且有這個特征的記錄可能有一大堆。有的時候你碰巧拿到的就是原來的那個,但大多數拿到的都是垃圾。如果你的表很全的話,那很有可能一堆記錄里面有個和原來的那條一模一樣的。這時候你可以根據別的什么信息猜猜找的是什么。比如你倆正打架,然后找出來他給你的單詞是F開頭的,那基本上就能猜出來了。
這就是哈希算法。一個好的哈希算法僅僅知道結果的話是極難反算出原始數據來的,特別是有意義的原始數據。
至于周老板怎么用我倒是不知道。不過他既然知道那些網址是非法的,那么肯定得有個小本,記錄著誰都干過壞事。然后想想之前的彩虹表(你懂的)。————————————————————————————————————————————————
就是空間映射函數,例如,全體的長整數的取值作為一個取值空間,映射到全部的字節整數的取值的空間,這個映射函數就是HASH函數。通常這種映射函數是從一個非常大的取值空間映射到一個非常小的取值空間,由于不是一對一的映射,HASH函數轉換后不可逆,即不可能通過逆操作和HASH值還原出原始的值,受到計算能力限制(注意,不是邏輯上不可能,前面的不可能是邏輯上的)而且也無法還原出所有可能的全部原始值。HASH函數運用在字典表等需要快速查找的數據結構中,他的計算復雜度幾乎是O(1),不會隨著數據量增加而增加。另外一種用途就是文件簽名,文件內容很多,將文件內容通過HASH函數處理后得到一個HASH值,驗證這個文件是否被修改過,只需要把文件內容用同樣的HASH函數處理后得到HASH值再比對和文件一起傳送的HASH值即可,如不公開HASH算法,那么信道是無法篡改文件內容的時候篡改文件HASH值,一般應用的時候,HASH算法是公開的,這時候會用一個非對稱加密算法加密一下這個HASH值,這樣即便能夠計算HASH值,但沒有加密密鑰依然無法篡改加密后HASH值。這種算法用途很廣泛,用在電子簽名中。HASH算法也可進行破解,這種破解不是傳統意義上的解密,而是按照已有的HASH值構造出能夠計算出相同HASH值的其他原文,從而妨礙原文的不可篡改性的驗證,俗稱找碰撞。這種碰撞對現有的電子簽名危害并不嚴重,主要是要能夠構造出有意義的原文才有價值,否則就是構造了一個完全不可識別的原文罷了,接收系統要么無法處理報錯,要么人工處理的時候發現完全不可讀。理論上我們終于找到了在可計算時間內發現碰撞的算法,推算了HASH算法的逆操作的時間復雜度大概的范圍。
HASH算法的另外一個很廣泛的用途,就是很多程序員都會使用的在數據庫中保存用戶密碼的算法,通常不會直接保存用戶密碼(這樣DBA就能看到用戶密碼啦,好危險啊),而是保存密碼的HASH值,驗證的時候,用相同的HASH函數計算用戶輸入的密碼得到計算HASH值然后比對數據庫中存儲的HASH值是否一致,從而完成驗證。由于用戶的密碼的一樣的可能性是很高的,防止DBA猜測用戶密碼,我們還會用一種俗稱“撒鹽”的過程,就是計算密碼的HASH值之前,把密碼和另外一個會比較發散的數據拼接,通常我們會用用戶創建時間的毫秒部分。這樣計算的HASH值不大會都是一樣的,會很發散。最后,作為一個老程序員,我會把用戶的HASH值保存好,然后把我自己密碼的HASH值保存到數據庫里面,然后用我自己的密碼和其他用戶的用戶名去登錄,然后再改回來解決我看不到用戶密碼而又要“偷窺”用戶的需要。最大的好處是,數據庫泄露后,得到用戶數據庫的黑客看著一大堆HASH值會翻白眼。
總結
以上是生活随笔為你收集整理的群人各说什么是哈希算法?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络电视机如何安装暴风影音软件
- 下一篇: 有诗意的游戏名字让人看了心情好的网名,怎