什么叫給密碼“加鹽”?如何安全的為你的用戶(hù)密碼“加鹽”?

硬核項(xiàng)目經(jīng)理
在面對(duì)這個(gè)網(wǎng)絡(luò)世界的時(shí)候,密碼安全總是各個(gè)公司和用戶(hù)都非常關(guān)心的一個(gè)內(nèi)容,畢竟現(xiàn)在大家不管是休閑娛樂(lè)還是學(xué)習(xí)購(gòu)物都是通過(guò)網(wǎng)上的帳號(hào)來(lái)進(jìn)行消費(fèi)的,所以我們通常會(huì)給用戶(hù)的密碼進(jìn)行加密。

在面對(duì)這個(gè)網(wǎng)絡(luò)世界的時(shí)候,密碼安全總是各個(gè)公司和用戶(hù)都非常關(guān)心的一個(gè)內(nèi)容,畢竟現(xiàn)在大家不管是休閑娛樂(lè)還是學(xué)習(xí)購(gòu)物都是通過(guò)網(wǎng)上的帳號(hào)來(lái)進(jìn)行消費(fèi)的,所以我們通常會(huì)給用戶(hù)的密碼進(jìn)行加密。在加密的時(shí)候,經(jīng)常會(huì)聽(tīng)到“加鹽”這個(gè)詞,這是什么意思呢?

我們通常會(huì)將用戶(hù)的密碼進(jìn)行 Hash 加密,如果不加鹽,即使是兩層的 md5 都有可能通過(guò)彩虹表的方式進(jìn)行破譯。彩虹表就是在網(wǎng)上搜集的各種字符組合的 Hash 加密結(jié)果。而加鹽,就是人為的通過(guò)一組隨機(jī)字符與用戶(hù)原密碼的組合形成一個(gè)新的字符,從而增加破譯的難度。就像做飯一樣,加點(diǎn)鹽味道會(huì)更好。

接下來(lái),我們通過(guò)代碼來(lái)演示一種比較安全的加鹽方式。

首先,我們建一個(gè)簡(jiǎn)單的用戶(hù)表。這個(gè)表里只有四個(gè)字段,在這里僅作為測(cè)試使用。

然后定義兩個(gè)方式,一個(gè)用來(lái)生成鹽,一個(gè)用來(lái)生成加鹽后的 Hash 密碼。

generateSalt() 方法很簡(jiǎn)單,就是生成一個(gè)隨機(jī)的四位字符的字符串,我們使用大小寫(xiě)加數(shù)字的形式生成這個(gè)字符串。這就是傳說(shuō)中的“鹽”。

接下來(lái)我們就可以使用 generateHashPassword() 方法為用戶(hù)的原密碼加鹽。在這里我們第一層先使用 sha1() 對(duì)原密碼進(jìn)行一次 Hash ,然后使用這個(gè) Hash 值拼接鹽字符串后再進(jìn)行 md5() 加密。最后加密出來(lái)的 Hash 值就很難在彩虹表中找到了。即使找到,也只是上層 sha1() 拼接鹽字符串的內(nèi)容,用戶(hù)的原文密碼畢竟還有一層加密。

剩下的就是我們進(jìn)行出入庫(kù)的注冊(cè)登錄測(cè)試了。

代碼還是比較簡(jiǎn)單的,在注冊(cè)的時(shí)候,我們直接對(duì)用戶(hù)密碼進(jìn)行加密后入庫(kù)。主要關(guān)注的地方是在登錄時(shí),我們先根據(jù)用戶(hù)名查找出對(duì)應(yīng)的用戶(hù)信息。然后將用戶(hù)登錄提交上來(lái)的原文密碼進(jìn)行加密,與數(shù)據(jù)庫(kù)中的原文密碼進(jìn)行對(duì)比驗(yàn)證,密碼驗(yàn)證成功即可判斷用戶(hù)登錄成功。

另外還需要注意的是,我們的鹽字符串也是要存到數(shù)據(jù)庫(kù)中的。畢竟在登錄的時(shí)候我們還是需要將用戶(hù)的原文密碼與這個(gè)鹽字符串進(jìn)行組合加密之后才能進(jìn)行密碼的匹配。

這樣加密后的代碼其實(shí)想通過(guò)彩虹表來(lái)破解基本上是很難了。在幾年前 CSDN 的帳號(hào)泄露事件中,大家發(fā)現(xiàn)作為中文程序員世界最大的網(wǎng)站竟然是明文存儲(chǔ)的密碼,這就為攻擊者提供了一大堆用戶(hù)的明文常用密碼。因?yàn)榇蠹叶枷矚g用同一個(gè)用戶(hù)名和密碼注冊(cè)不同的網(wǎng)站,所以不管其他怎么加鹽都是沒(méi)用的,畢竟原文密碼是對(duì)的,拿到這樣一個(gè)網(wǎng)站的數(shù)據(jù)庫(kù)中的用戶(hù)明文密碼后,就可以通過(guò)這些密碼去嘗試這些用戶(hù)在其他網(wǎng)站是不是用了相同的帳號(hào)名和密碼注冊(cè)了帳號(hào)。所以在日常生活中,我們重要的一些網(wǎng)站帳號(hào)、密碼盡量還是使用不同的內(nèi)容,如果記不住的話(huà),可以使用一些帶加密能力的記事本軟件進(jìn)行保存,這樣會(huì)更加安全。而我們程序員,則應(yīng)該始終都將用戶(hù)的密碼及重要信息進(jìn)行加密處理,這是一種基本的職業(yè)規(guī)范。

THEEND

最新評(píng)論(評(píng)論僅代表用戶(hù)觀(guān)點(diǎn))

更多
暫無(wú)評(píng)論