安全隨筆1 謹慎一次MD5值的可被窮舉性

2021-08-02 11:13:10 字數 2279 閱讀 4092

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毫秒。

明白了這一點,我們就需要找乙個方法來改進md5求值。目前,最通用的做法是多次md5值法。我們修改ge***5hash方法,如下:

static

string

ge***5hash(

string

input)

}

在改進過後的方法中,我們首先設計了乙個足夠複雜的密碼hashkey(秘鑰),然後將它的md5值和使用者輸入密碼的md5值相加,再求一次md5值作為返回值。經過這個過程以後,密碼的長度夠了,複雜度也夠了,想要通過窮舉法來得到真正的密碼值的成本就大大增加了。(也可以用將密碼與乙個key進行異或,之後再計算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...