0 消息摘要算法
- 消息摘要算法的主要特徵是加密過程不需要密鑰,並且經過加密的數據無法被解密,可以被解密逆向的只有
CRC32算法
,只有輸入相同的明文數據經過相同的消息摘要算法才能得到相同的密文。
-
消息摘要算法不存在密鑰的管理與分發問題,適合於分佈式網絡上使用。
-
消息摘要算法主要應用在“數字簽名”領域,作爲對明文的摘要算法。著名的摘要算法有RSA公司的MD5算法和SHA-1算法、SHA-2算法及其大量的變體。
1 MD5
1.1 算法定義
- MD5的全稱爲 Message-Digest Algorithm,是一種被廣泛使用的單向散列函數、屬於Hash算法中一種比較重要算法——具有單項加密、加密結果唯一、安全性能好等優點。
- MD5算法可以產生出一個128位(16字節)的散列值(哈希值),用於確保信息傳輸完整一致;以512位分組來處理輸入的信息,且每一分組又被劃分爲16個32位子分組,經過了一系列的處理後,算法的輸出由四個32位分組組成,將這四個32位分組級聯後將生成一個128位散列值。
-
2004年,證實MD5算法無法防止碰撞(collision),因此不適用於安全性認證,如SSL公開密鑰認證或是數字簽名等用途。
-
對於任意長度的消息,這個摘要相當於是個長度爲16個字節的數組,通常用一個長度爲32的十六進制字符串來表示。
-
MD5是一種算法,通常用於在數據庫中存儲密碼。
在在Internet初期,網站主要將密碼以明文形式保存在數據庫中,然而這並不安全,因此人們使用MD5來混淆數據庫中的密碼。
MD5信息摘要算法可以從任何密碼,短語或文本中生成32個字符的十六進制字符串,比如:如果用戶的密碼是654321,那在數據中就會生成 c33367701511b4f6020ec61ded352059 這樣的字符串。因此,IT人員就看不到用戶的密碼,如果有人偷了數據庫,就不會直接獲得所有密碼。
- MD5在線解密的原理與步驟
MD5本身不可逆,但仍然有一些網站聲稱支持在線解密MD5碼。
MD5解密主要是用於攻防演練或網絡安全測試,在對網站入侵過程中,獲得了管理員或者其他用戶賬號和密碼值。
現在網上有很多流行的MD5在線解密平臺和解密工具,其作用也是針對用戶密碼,或比較簡單的密文進行解密,方法是將常用字符串的MD5密碼保存到數據庫,然後再與待解密的字符串做對比,最終找到匹配的源碼。下圖是MD5在線加密解密平臺流程圖:
1.2 MD5算法不安全的原因
1.2.1 字典表很大
在網上有很多md5解密網站(如:https://md5.cn/),就如同一個字典表。通過在數據庫存儲很多常用的密碼,可以在很短的時間內查找任何哈希值的答案。這種數據庫佔用大量的磁盤空間,具有一定的成功率。在計算機安全領域,一些朋友需要用到MD5解密網站,通過這類型的網站,可以提高工作效率,大家可以去試試。
1.2.2 碰撞
安全的算法具有良好的抗衝突性。
也就是說:對於不同的數據輸入,獲得相同哈希值的可能性比較低,但是MD5的抗衝突性較低。
1.2.3 暴力攻擊速度很快
蠻力攻擊是通過嘗試多種可能性來查找密碼的一種方法,即可以猜測用戶可能使用的東西(出生日期,孩子的名字,寵物的名字等),也可以嘗試一切(從a,b, c到10個字符的特殊字符密碼)。抵禦暴力攻擊的唯一方法可能是密碼長度,如果您擁有40個字符長的隨機密碼(帶有特殊字符),那麼目前你的密碼可能是安全的。
1.3 MD5不安全,可採取什麼方法來提高安全性?
使用長密碼
強制用戶使用更長的密碼(可能是15個字符或更多),此外還可以增加密碼的複雜度,以確保他們使用的是大寫,小寫和特殊字符。但是,人們經常會使用弱密碼。因此,很容易被猜到,更糟糕的是,有的人甚至在便籤紙上記錄密碼。
用鹽
嘗試做的第一件事就是在加密密碼時使用salt,基本上,鹽是您在每個密碼之前和/或之後添加的單詞。如果鹽是“ randomsaltformypassword”,並且用戶選擇“ 654321”作爲密碼,則將“ randomsaltformypassword654321”用作MD5功能參數。
這樣,你就可以在數據庫中加密更長的密碼,並且黑客很難找到相應的密碼,請確保選擇長字樣以充分提高安全性。
使用其他哈希函數
最好的解決方案可能是使用其他加密算法(如:SHA256、...)。
雖然這可能不是最簡單的方法,因爲這可能涉及更改數據庫結構,但這可能是最安全的方法。
2 SHA1
SHA1是一種密碼散列函數,可以生成一個被稱爲消息摘要的160位(20字節)散列值,散列值通常的呈現形式爲40個十六進制數。
該算法輸入報文的長度不限,產生的輸出是一個160位的報文摘要。
輸入是按512 位的分組進行處理的。
SHA-1是不可逆的、防衝突,並具有良好的雪崩效應。
3 SHA256
3.1 算法定義
SHA256 算法 (Secure Hash Algorithm 256)
-
一種具有確定性的單向哈希函數/單向散列函數(deterministic , one-way , hash , function)
-
256代表最終的哈希值摘要是固定長度的256位
- 哈希值通常用一個長度爲64的十六進制字符串(由隨機字母和數字組成的)來表示,相當於是個長度爲32個字節的數組,其中1個字節=8位。即無論明文大小如何,哈希值始終爲256 位。
- 例如:"愛我中華2023" (UTF-8編碼) 通過 SHA256運算後,可得其輸出的摘要
2959c3680fb764ba020aacfd06818f7aaffa7a9133c4864ba98a1ab3239b71ba
簡言之,SHA 256通過將消息和文件等數據轉換爲固定長度爲256位的、且難以區分的字符串來保護數據不被截取或篡改。幾乎各行各業都會使用SHA256算法,包括政府機構和區塊鏈等創新技術。
- 數據指紋:輸入的數據長度是任意的,輸出的數據長度是固定的。可將其輸出理解爲原數據的數據指紋。
- 它具有確定性特徵。同一輸入值,總能得到相同的輸出值。
- SHA256是指輸出長度爲256位的安全、哈希算法。
3.2 算法特點
3.2.1 (輸入)消息長度
輸出具有固定大小,但輸入沒有大小限制。
3.2.2 (輸出)摘要長度
- 摘要長度:消息摘要(即將加密哈希函數應用於數據的哈希值)長度應爲 256 位。
在您的服務器上安裝 SSL 證書時,您可以選擇SHA-512或更大的摘要。
雖然SHA-512更安全,但不建議將其用於大多數系統,因爲它需要更強大計算能力和計算機性能。
3.2.3 單向性(不可逆性)
所有哈希函數(例如 SHA 256)在設計上都是不可逆的。
對於每個輸入,您只有一個輸出,但反之則不然。多個不同的輸入可能產生相同的輸出。
- 單向性(不可逆性)
- 單向代表了函數很難逆推。
- 有些函數很容易逆推,如:function y = x + 30(只需-30,就可以逆推回輸入數據x)
- 但如果你要逆推兩個大素數的乘法公式,則很難
- 單向代表了函數很難逆推。
3.2.4 運算性能高
- 基於本函數進行運算,以現有計算機算力,支持每秒運算6千億億次以上。
- 其他函數,如 傅里葉變換函數等是無法達到這種運算量級的。
3.3 算法應用
SHA 256 是用於數字簽名驗證、SSL 握手、密碼保護和許多其他安全相關操作的標準哈希算法。
3.3.1 簡單Demo
現在請看哈希函數是如何工作的真實示例。假設您寫了“便宜SSL證書”的消息並對其應用 SHA-256 哈希函數,將會得到:
3868401EDD8E4AE2F804AC3A6215C5EC522AE032F59C13296C1A25CAE4F26C52
現在,我們在消息末尾添加一個感嘆號:“便宜SSL證書!”,並生成輸出。結果則是這樣:
EE39F1A692558947B80109483AF80ACC1E3722D533B7A9E7713E823F6E2D2A57
如您所見,僅添加一個字符,哈希值長度保持不變,但是得到的結果完全不同,這也就是爲什麼sha256比較安全的原因。
如果您要將此消息發送給朋友,則需提供哈希值並指定算法。
您的朋友會在他們的那端驗證哈希值,如果匹配,他們就會知道該消息是真實的。
3.3.2 數字簽名驗證
數字簽名是一種電子簽名,用於驗證消息(例如電子郵件、信用卡交易或電子文檔)的真實性和完整性。它是通過散列文件,並使用 PKI(公鑰基礎設施)對其進行加密而創建的。
SHA 256算法在整個過程中的作用是保證數字簽名的完整性。接收方的客戶端檢查自己端的哈希算法,並使用公鑰對消息進行解密。如果匹配,則數據是真實有效、未被篡改。
3.3.3 SSL握手 & SSL證書(HTTPS)
-
SSL 握手是Web瀏覽會話的關鍵元素,它依賴於SHA算法功能。通過SSL/TLS的通信總是從SSL握手開始,這是一種非對稱加密技術,允許瀏覽器驗證web服務器,獲得公鑰,並在數據傳輸開始之前建立一個安全連接。
-
無論數字證書品牌、價格和類型如何,所有SSL證書的通用規範是採用SHA 256算法,您可以在證書詳細信息或產品信息中列出的功能中看到。
-
根據用於監控 SSL/TLS 支持質量的全球儀表板SSL Pulse稱,Alexa全世界最受歡迎的網站列表中,有97.2%的網站使用 SHA-256 算法的SSL證書。
3.3.4 密碼保護 / 數據脫敏
- 網站以散列格式存儲用戶密碼。如前所述,哈希使用加密算法將密碼轉換爲一串短的字母和數字。如果網站被黑客入侵,網絡攻擊者將無法獲得哈希密碼。
3.3.5 區塊鏈交易 & 比特幣
-
SHA-256 算法是創建比特幣時用於加密貨幣的第一個算法。
-
區塊頭是區塊鏈的基本元素,因爲它們有助於以特定順序將一個交易區塊連接到下一個交易區塊。正如之前提到的,當輸入的信息有微不足道的差別,SHA算法也能產生大相徑庭的結果。
-
當任意區塊發生變化時,都會影響後續的所有區塊。所以如果想要修改某個區塊的內容,就必須修改後許所有區塊的內容,而這幾乎是不可能的,從而保證了區塊數據的安全。
-
比特幣挖礦的過程,就是反向找到輸入值的過程。
這個輸入值通過SHA256算法產生了一串開頭帶有約70個0的輸出值
但是因爲沒有已知的公式,每個人能做的也只是通過蠻力一個數一個數去試,直到找到正確的輸入值。
不過比特幣只需要找到一個接近輸入值的哈希值就好,不需要完全匹配。
實際上,挖礦難度可以調整,保證大概每10分鐘能夠有曠工找到匹配的輸入值,然後賺取12.5比特幣的出塊獎勵。
沒有人能找到比特幣挖礦的捷徑,雖然找到捷徑存在巨大的經濟動力。
這就是爲什麼 SHA256 是地球上最流行的算法。
3.4 算法歷史:SHA-0/1993 => SHA-1/1995 => SHA-2/2001 => SHA-3/2015
安全散列算法是美國國家安全局 (NSA) 創建的。美國政府爲這項技術申請了專利,然後以免版稅許可的形式發佈,供所有人使用。
第一個SHA-0算法可以追溯到 1993 年。緊接着SHA-1於1995年問世,儘管已被破解,但現在還是有在一些老版本的服務器和客戶端上使用。2001年,NSA發佈了 SHA -2系列算法,其中包括 SHA 256 和其他五個不同算法標準:
- SHA 224
- SHA 384
- SHA 512
- SHA 512/224
- SHA 512/256
2015 年 8 月 5 日,NIST(美國國家標準與技術研究院)發佈了 SHA -3,這是最新的安全哈希算法,內部算法設計與以往不同。雖然 NIST 目前還沒有計劃吊銷 SHA-2 算法,但如果有必要,SHA-3可以在當前應用中替代掉SHA-2。
3.5 SHA256 與 MD5 算法的區別?
相同點
1、都是密碼散列函數,加密不可逆。
2、都可實現對任意長度對象加密,都不能防止碰撞。
不同點
-
安全性方面:
1、SHA256(稱SHA2)的安全性最高;(相對md5和SHA1而言,SHA256很安全)
2、md5相對來說比較容易碰撞,安全性沒這麼高。 -
性能方面:
以個60M的key爲測試樣本,經過1000次的測試平均值,這兩種算法的表現如下:
MD5算法運1000次的平均時間爲:226ms
SHA256算法運1000次的平均時間爲:473ms
總而言之,md5和sha256都是密碼散列函數,加密不可逆。雖然都不能絕對地防止碰撞,但是相對而言,md5比較容易碰撞,安全性沒有sha256高。