MD5和SHA-1


MD5和SHA-1都是我們耳熟能詳的術語了,很多人可能知道他們跟加密有關系,但是他們是怎么做到加密的,他們各自的特點又是什么。我來簡單的講一講。

MD5和SHA-1都被稱作哈希(Hash)函數,用過Java語言的人對這個術語應該相當熟悉。Java類庫里的Object類定義了hashCode這個函數,但是java的概念略有不同。正式的哈希函數的定義是“把任意長度的數據計算成固定長度的數據”。也就是說函數的輸入是任意長的,輸出總是固定長度的。MD5和SHA-1是兩種加密用哈希函數,MD5的返回值總是128bit的,SHA-1的返回值是160bit,都是固定長度。MD5如果按十六進制表示的話是32位十六進制的數,SHA-1是40位十六進制的數。

你可以用下面兩個網站試用這兩個函數,這樣有個感性認識:

MD5:http://md5-hash-online.waraxe.us/

SHA-1:http://sha1-hash-online.waraxe.us/

你輸入任意長度的字符串,都會返回給你相應固定長度的十六進制返回值。這兩個函數的返回值都被稱為信息摘要(Message Digest,實際上MD就是Message Digest的縮寫)。

 

那么兩個函數為什么可以用在加密上呢?因為他們都有這幾個特性

  1. 都是“不可逆”的函數。不存在一個算法能夠由哈希值倒算出原始信息。
  2. 對原始信息的任何一點改變都會導致結果的哈希值巨大的不同。舉個例子,假如原始數據是幾百萬字的文章,你在其中哪怕改動一個標點,計算出的哈希值都會有很大的變化。
  3. 運算代價是相對較低的。普通的AMDOpteron 2.2GHz的芯片,每秒可以計算出335MB數據的MD5值,可以計算192MB數據的SHA-1值。   參見https://en.wikipedia.org/wiki/SHA-1#Comparison_of_SHA_functions
  4. 類似於1,除非通過蠻力的窮舉法,否則無法找到兩段不同的信息而有相同的哈希值。(這一點現在已被證明是不成立的了,請看后文)

 那么這兩個函數的特點在哪里呢?特點在於都能“通過哈希值唯一標識原信息”。這個怎么講,就是比如原始信息是A,我知道原始信息的哈希值Ha,如果我有另一段信息,這段信息的哈希值也是Ha的話,我就能“以極大的可靠性”斷定這另一段信息就是A。也就是說哈希值能“唯一”標識原始信息。原因是什么呢?

  1. 兩段不同信息“碰巧”有着相同的哈希值的概率是很低的,對於MD5來說是2的128次方分之一,這個數字是多小呢:太陽的表面積是6萬億平方公里,一個原子的截面積大約是1平方納米,假設你是一個原子,把你放在56個太陽中任意一個的表面,這個概率是我在這56個太陽上隨意指定一點,正好點中你的概率,而你是一個小小小的原子。對SHA-1來說,這個概率就更低了。
  2. 那么有沒有辦法人工偽造一段信息正好有Ha這個哈希值呢?根據上面的1和4,這個可能性是很低的,要通過窮舉法的巨大的運算量才能做到。

 

那么他們通常有什么應用呢?

1.      密碼加密(很常用的一種用法)

比如我有一個網站,用戶注冊的時候會輸入用戶名密碼,大家都知道如果密碼是明文的方式存儲在數據庫里的話,如果這個數據泄漏或者內部人員作惡的話,會造成信息安全問題。所以通用的做法是把用戶輸入的密碼做MD5或SHA-1的運算,把返回的固定長度的哈希值存儲在數據庫中。比如用戶的密碼是”bigcat”,實際存儲在數據庫中的值是它的SHA-1的值a748bf7fee2289b22d448ed8efde10a68f7d1cf9。因為這兩個函數的“不可逆”性,所以任何人拿到這個hash值是無法知道用戶的明文密碼的。

2.      文件校驗

在網上下載大尺寸文件的時候常見到網站同時會提供這個文件的MD5的值,它的作用是用戶下載后可以在下載文件基礎上計算MD5的值,如果和網站提供的MD5是相同的說明文件在下載過程中沒有損壞或者說文件沒有被惡意網站修改。


免責聲明!

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



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