要求:git
(1)給出散列函數的具體應用。算法
(2)結合生日攻擊、以及200四、2005年王曉雲教授有關MD5安全性和2017年google公司SHA-1的安全性,說明散列函數的安全性以及目前安全散列函數的發展。問題2的回答能夠結合下面給出的第一個連接。數據庫
(3)結合md5算法中的選擇前綴碰撞以及第二個連接中的helloworld.exe和goodbyworld.exe兩個可執行文件的md5消息摘要值和兩個文件的執行結果說明md5算法來驗證軟件完整性時可能出現的問題。編程
1、散列函數的具體應用安全
Hash(散列函數),通常翻譯作"散列",也有直接音譯爲"哈希"的,就是把任意長度的輸入(又叫作預映射, pre-image),經過散列算法,變換成固定長度的輸出,該輸出就是散列值。因爲散列函數的應用的多樣性,它們常常是專爲某一應用而設計的。正確的應用場景:
1,數據校驗
HASH函數有相似數據冗餘校驗相似的功能,可是它比簡單的冗餘校驗碰撞的機率要小得多,顧而在如今密碼學中老是用HASH來作關鍵數據的驗證。
2,單向性的運用
利用HASH函數的這個特色,咱們可以實現口令,密碼等安全數據的安全存儲。密碼等不少關鍵數據咱們須要在數據庫中存儲,可是在實際運用的過程當中,只是做比較操做,顧而咱們能夠比較HASH結 果。這一點相信在銀行等系統中有所運用,不然咱們真的要睡不着覺了:)
3,碰撞約束以及有限固定摘要長度
數字簽名正是運用了這些特色來提升效率的。咱們知道非對稱加密算法速度較低,經過HASH處理咱們可使其僅僅做用於HASH摘要上,從而提升效率。
4,能夠運用HASH到隨機數的生成和密碼,salt值等的衍生中
由於HASH算法可以最大限度的保證其惟一性,故而能夠運用到關鍵數據的衍生中(從一個隨機的種子數產生,而且不暴露種子自己祕密)。編程語言
2、結合生日攻擊、以及2004、2005年王曉雲教授有關MD5安全性和2017年google公司SHA-1的安全性,說明散列函數的安全性以及目前安全散列函數的發展函數
緣由:哈希碰撞:兩個不一樣的輸入,通過哈希算法後,獲得了一樣的哈希值,就叫作哈希碰撞。google
因爲一般的哈希算法中,哈希值的空間遠小於輸入的空間,這就意味着信息熵有丟失。加密
一個空間較大的集合(輸入)經過哈希算法映射到一個空間較小的集合(哈希值),必然會形成多個輸入映射到一個哈希值上,這就是所謂的哈希碰撞。spa
例子:生日攻擊
首先理解生日悖論:
生日悖論:若是一個房間裏有23個或23個以上的人,那麼至少有兩我的的生日相同的機率要大於50%。對於60人以上,這種機率要大於99%。
嚴格意義上,這並非一個悖論,稱之爲悖論是因爲跟人們的常識相悖。
生日攻擊是以機率論中的生日問題爲數據基礎的一種密碼學攻擊方法。
根據生日悖論,若是哈希值的位數太短,很容易能夠找到一組(兩個)哈希值相同的輸入,這就是一種最經常使用的生日攻擊的應用。
使用一個64位的哈希函數,大約有 1.8 × 10^19 個不一樣的哈希值。
若是產生每一個哈希值的可能性是相同的,那麼只需大約 5.1 x 10^9 次(51億次)暴力嘗試就能夠獲得一次哈希碰撞。
例子:王曉雲破解MD5
MD5最大的問題在於,經過我國的王曉雲教授等學者的工做,md5已經被證實能夠進行碰撞攻擊。也就是說,攻擊者能夠產生兩個應用程序,內容不同,可是哈希值徹底同樣。
在雲存儲的應用場合中,這種危害表現爲攻擊者能夠僞造一個Windows 的安裝光盤,在其中嵌入木馬,經過上述手段讓MD5哈希值和微軟官方發佈的光盤一致,搶先上傳到分享類網盤中。若是該網盤採用MD5檢查重複文件(例如離線下載服務), 木馬就會被植入到但願下載原版光盤用戶的電腦中。
這種攻擊形式不是天方夜談,根據微軟官方的報告,一款名爲Flame的木馬就用了相似的手段。固然,這種方式目前仍是很是高級的攻擊手段。
散列函數的發展:
MD5 和 SHA1 是目前應用最普遍的Hash算法
SHA1是由NIST NSA設計爲同DSA一塊兒使用的,它對長度小於2^64位的輸入,產生長度爲160bit的散列值,所以抗窮舉(brute-force)性更好。
最新的發展爲:在使用安全哈希算法時,考慮使用SHA-2系列算法乃至更高級別算法,而不是MD5。
3、結合md5算法中的選擇前綴碰撞以及第二個連接中的helloworld.exe和goodbyworld.exe兩個可執行文件的md5消息摘要值和兩個文件的執行結果說明md5算法來驗證軟件完整性時可能出現的問題
MD5:用於確保信息傳輸完整一致。是計算機普遍使用的雜湊算法之一,主流編程語言廣泛已有MD5實現。將數據(如漢字)運算爲另外一固定長度值,是雜湊算法的基礎原理,MD5的前身有MD二、MD3和MD4。
MD5算法具備如下特色:
(1)壓縮性:任意長度的數據,算出的MD5值長度都是固定的。
(2)容易計算:從原數據計算出MD5值很容易。
(3)抗修改性:對原數據進行任何改動,哪怕只修改1個字節,所獲得的MD5值都有很大區別。
(4)強抗碰撞:已知原數據和其MD5值,想找到一個具備相同MD5值的數據(即僞造數據)是很是困難的。
MD5的做用是讓大容量信息在用數字簽名軟件簽署私人密鑰前被"壓縮"成一種保密的格式(就是把一個任意長度的字節串變換成必定長的十六進制數字串)。除了MD5之外,其中比較有名的還有sha-一、RIPEMD以及Haval等。
MD5的用處主要有一下幾個場景:
(1)數據完整性校驗:檢查數據有沒有被篡改過,這裏取個例子。當用Android手機進行OTA升級的時候,下載完升級包(無論是全升包仍是增量包),緊接着就是用該升級包的標準MD5進行驗證,若是校驗的結果等於標準的MD5值,那麼就證實這個升級包沒有被篡改過。
(2)不可逆的加密:
像Unix系統中,用戶用用戶名和密碼登錄系統,因爲系統中存放的是用戶名和密碼組合MD5校驗值,因此登錄框將會把用戶名和密碼進行MD5算法從而生成用戶名和密碼組合的MD5校驗值,系統由此能夠知道能不能登錄成功。
選擇前綴碰撞:將碰撞合併到一對文件中時,除了構成碰撞的相對較小的隨機查找字節塊以外,構造碰撞的原始方法要求文件徹底相等。前綴衝突只有在碰撞後文件應該徹底相等的要求。以前發現碰撞的兩個文件的碰撞能夠是任何事情:咱們的選擇前綴碰撞查找方法老是會產生一個碰撞,該碰撞能夠合併到兩個文件中,而無論在碰撞以前存在什麼數據。
可能出現的問題:若是有第三方在驗證軟件完整性時截取軟件代碼,使用快速MD5碰撞生成器,在短期內僞造一份相同的MD5,並惡意篡改軟件,那麼安全性將會大大降低。當軟件過大時,在驗證過程當中所需的時間也會大大增長,對於第三方而言,攻擊的成功機率也會增長。沒法定位給定的散列值,並生成一個(有意義的)輸入位串哈希到給定的值。
以上即是個人我的對散列函數內容的整理和理解,其中包含網上百科內容,因爲我的能力有限,請你們見諒!