MD5和SHA-1

MD5和SHA-1都是咱們耳熟能詳的術語了,不少人可能知道他們跟加密有關係,可是他們是怎麼作到加密的,他們各自的特色又是什麼。我來簡單的講一講。java

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。也就是說哈希值能「惟一」標識原始信息。緣由是什麼呢?url

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

 

那麼他們一般有什麼應用呢?.net

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

好比我有一個網站,用戶註冊的時候會輸入用戶名密碼,你們都知道若是密碼是明文的方式存儲在數據庫裏的話,若是這個數據泄漏或者內部人員做惡的話,會形成信息安全問題。因此通用的作法是把用戶輸入的密碼作MD5或SHA-1的運算,把返回的固定長度的哈希值存儲在數據庫中。好比用戶的密碼是」bigcat」,實際存儲在數據庫中的值是它的SHA-1的值a748bf7fee2289b22d448ed8efde10a68f7d1cf9。由於這兩個函數的「不可逆」性,因此任何人拿到這個hash值是沒法知道用戶的明文密碼的。

2.      文件校驗

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

相關文章
相關標籤/搜索