md5不再安全不是從演算法本身而言。如果從可逆性角度出發, md5值不存在被破解的可能性。md5的演算法公式如下:
r=h(s)
該公式指出:對於給定的乙個源內容s,h可以將其對映為r。這裡要注意幾個特點。首先,s到r的對映是一種多對一的對映;其次,r作為目標內容,是乙個無規律的定長的字串;最後,對映h是一種壓縮對映,即r的空間遠遠小於s。
md5的演算法特性使其無法存在乙個逆過程,即:將r還原成為s,下面的公式不成立:
r=h-1(s)
正是基於以上的特點,md5被廣泛用於密碼驗證和訊息體完整性驗證。相信大家對於密碼驗證使用md5演算法都不陌生。假設新註冊了乙個使用者,當註冊使用者的密碼第一次被儲存到資料庫的時候,我們往往將其轉換為md5值儲存:
static
void
main(
string
args)
的md5值:到資料庫。
", source, hash);
}static
string
ge***5hash(
string
input) }
以上**輸出:
儲存密碼原文:luminji's key的md5值:d3a8e4d76a0aef23b65d9f6d6bcb358f到資料庫。
有了md5值儲存在資料庫中,在使用者進行登入的時候,只要校驗md5就可以確保使用者輸入的是否是正確的密碼了。如下:
static
void
main(
string
args)
else
}static
bool
verifymd5hash(
string
input,
string
hash)
本段**的輸出為:
請輸入密碼,按回車鍵結束……luminji
's key
密碼正確,准許登入系統。
或許大家會問:為什麼不直接儲存密碼,而使用md5值呢?如果非要回答這個問題,我想更大程度上還是要從保護我們自己的隱私著想。即便是乙個銀行系統,我們也不想讓銀行的後台管理人員看到我們的密碼。而通過md5值,就可以確保這一點。通過驗證md5值,即保證了無人可以檢視或破解我們的密碼,也到達了密碼驗證的目的。雖然有人可能會質疑,md5的演算法不是乙個多對一的對映嗎?也就是說,很有可能存在乙個另外的密碼,求出來的md5值和我的這個密碼是一樣的。但是,在實際應用場合中,這個概率會很小,小到可以忽略不計。
既然到目前為止,說到的都是md5的好處,那麼,為什麼說md5是不安全的呢?因為,這個世界上還有乙個方法,叫做窮舉法。鑑於使用我們的軟體產品的使用者大多數不是計算機專家,安全意識普遍比較薄弱,所以這類使用者設定的密碼很有可能是簡單的數字組合。這個時候,窮舉法就會派上很大的用處。以密碼「8888」為例,測試下我們的窮舉演算法可以多長時間破解掉密碼:
static
void
main(
string
args)
}watch.stop();
console.writeline(
"密碼已破解,為:,耗時毫秒。
", key, watch.elapsedmilliseconds);}
在上面的**中,我們假設使用者**是「0」到「9999」的字串,並在此範圍內進行匹配。結果輸出為:
開始窮舉法破解使用者密碼……密碼已破解,為:
8888
,耗時271毫秒。
可見,如果我們的密碼輸入的過份簡單,計算機甚至都不需要1秒時間就能完成暴力破解。當然,這種演算法不是針對md5的可逆破解,而是非常愚笨的窮舉。但是,即便是這樣,窮舉帶來的危害仍然是巨大的。現在,已經有很多的免費或商業的md5字典庫,儲存了相當數量的字串的md5值,我們只要提交乙個md5值進去,立刻就可以得到它的原文,只要這個原文不是非常複雜。所以,從這個方面來說,md5不再安全。
明白了這一點,我們就需要找乙個方法來改進md5求值。目前,最通用的做法是多次md5值法。我們修改ge***5hash方法,如下:
static
string
ge***5hash(
string
input)}
在改進過後的方法中,我們首先設計了乙個足夠複雜的密碼hashkey,然後將它的md5值和使用者輸入密碼的md5值相加,再求一次md5值作為返回值。經過這個過程以後,密碼的長度夠了,複雜度也夠了,想要通過窮舉法來得到真正的密碼值的成本就大大增加了。
安全隨筆1 謹慎一次MD5值的可被窮舉性
md5不再安全不是從演算法本身而言。如果從可逆性角度出發,md5值不存在被破解的可能性。md5的演算法公式如下 r h s 該公式指出 對於給定的乙個源內容s,h可以將其對映為r。這裡要注意幾個特點。首先,s到r的對映是一種多對一的對映 其次,r作為目標內容,是乙個無規律的定長的字串 最後,對映h是...
安全的Md5加密 兩次加密 加鹽
commons codec commons codec org.apache.commons commons lang3 3.6import org.apache.commons.codec.digest.digestutils import org.junit.test author yhq da...
mac獲取簽名的SHA1和MD5值
在終端中輸入 keytool list v keystore android debug.keystore然後會提示讓你輸入密碼,直接回車,就會出現你要的內容。當然程式設計師都是比較懶的,直接複製下面這個命令就可以了 keytool list v keystore android debug.key...