最近有個(gè)同學(xué)在面試中遇到了一個(gè)很有意思的問(wèn)題,我相信大多數(shù)的同學(xué)可能都沒(méi)有遇到過(guò)。
面試官提問(wèn)說(shuō):“為什么很多網(wǎng)站忘記密碼需要重置,而不是直接告訴用戶原密碼?”
很有意思的問(wèn)題對(duì)不對(duì)。很多網(wǎng)站中都有“忘記密碼”的功能,但是為什么當(dāng)我們點(diǎn)擊忘記密碼,經(jīng)過(guò)一堆驗(yàn)證之后,網(wǎng)站會(huì)讓我們重置密碼,而不是直接告訴我們?cè)艽a呢?
所以,今天咱們就來(lái)說(shuō)一說(shuō)這個(gè)問(wèn)題。
防止信息泄露
2022年11月1日,Termly 更新了《98個(gè)最大的數(shù)據(jù)泄露、黑客和曝光事件》(98 Biggest Data Breaches, Hacks, and Exposures)。其中包括很多知名網(wǎng)站,比如:Twitter
所以,你保存在網(wǎng)站中的數(shù)據(jù)可能并沒(méi)有那么安全。那么這樣的數(shù)據(jù)泄露后會(huì)對(duì)用戶產(chǎn)生什么影響呢?
對(duì)大多數(shù)人來(lái)說(shuō)最相關(guān)的經(jīng)歷(網(wǎng)上看到的)應(yīng)該是詐騙電話,他們甚至可以很清楚的告訴你你的所有個(gè)人信息。那么這些信息是怎么來(lái)的呢?
有些同學(xué)可能說(shuō)是因?yàn)?ldquo;網(wǎng)站販賣了我的個(gè)人信息”,其實(shí)不是的。相信我 大多數(shù)的網(wǎng)站不會(huì)做這樣的事情。
出現(xiàn)這樣事情的原因,大部分都是由于數(shù)據(jù)泄露,導(dǎo)致你所有的個(gè)人信息都被別人知道了。
那么,同理。既然他們可以獲取到你的私人信息,那么你的賬戶和密碼信息是不是也有可能被盜取?
而對(duì)于大多數(shù)的同學(xué)來(lái)說(shuō),為了防止密碼太多忘記,所以很多時(shí)候 大家都會(huì)使用統(tǒng)一的密碼! 也就是說(shuō)你的多個(gè)賬號(hào)可能都是同一個(gè)密碼。所以,一旦密碼泄露,那么可能會(huì)影響到你的多個(gè)賬號(hào),甚至是銀行卡賬號(hào)。
因此,對(duì)于網(wǎng)站(特別是一些大網(wǎng)站)來(lái)說(shuō),保護(hù)用戶數(shù)據(jù)安全就是至關(guān)重要的一件事情。那么他們一般會(huì)怎么做呢?
通常的處理方式就是 加密。并且這種加密可能會(huì)在多個(gè)不同的階段進(jìn)行多次。比如常見(jiàn)的:SHA256、加鹽、md5、RSA 等等。
這樣看起來(lái)好像是很安全的,但是還有一個(gè)問(wèn)題,開(kāi)發(fā)人員知道如何解密他們。或者有些同學(xué)會(huì)認(rèn)為 數(shù)據(jù)庫(kù)中依然存在著正確的密碼 呀?一旦出現(xiàn)信息泄露,不是依然會(huì)有密碼泄露的問(wèn)題嗎?
是的,所以為了解決這個(gè)問(wèn)題,網(wǎng)站本身也不知道你的密碼是什么。
網(wǎng)站也不知道你的密碼是什么
對(duì)于網(wǎng)站(或者其他應(yīng)用)來(lái)說(shuō),它們是 不應(yīng)該 存儲(chǔ)你的原密碼的。而是通過(guò)一些系列的操作來(lái)保存你加密之后的代碼。并且這個(gè)加密是在前端傳輸?shù)椒?wù)端時(shí)就已經(jīng)進(jìn)行了,并且是 不可逆 的加密操作,例如:MD5 + 加鹽。
我們舉一個(gè)簡(jiǎn)單的例子:
比如有個(gè)用戶的密碼是 123456,通過(guò) md5 加密之后是:E10ADC3949BA59ABBE56E057F20F883E
md5 理論上是不可逆的,所以從理論上來(lái)說(shuō)這個(gè)加密后的代碼是不可解析的。但是 md5 有個(gè)比較嚴(yán)重的問(wèn)題就是:同樣的字符串加密之后會(huì)得到同樣的結(jié)果。
這也就意味著:E10ADC3949BA59ABBE56E057F20F883E 代表的永遠(yuǎn)都會(huì)是 123456
所以,如果有一個(gè)很大的 md5 密碼庫(kù),那么理論上就可以解析出所有的 md5 加密后的字符串。就像下圖一樣:

因此,在原有的 md5 加密之上,很多網(wǎng)站又增加了 加鹽 的操作。所謂加鹽指的就是:在原密碼的基礎(chǔ)上增加一些字符串,然后進(jìn)行 md5 加密。
比如:
- 原密碼為 123456
- 在這個(gè)密碼基礎(chǔ)上增加固定字符“LGD_Sunday!”
- 得到的結(jié)果就是:“LGD_Sunday!123456”
- 然后用該字符進(jìn)行 md5 加密,結(jié)果是:E1FC8CB7B54BED0FDC8711530236BA4D
- 此時(shí)嘗試解密,會(huì)發(fā)現(xiàn) 解密失敗

這樣大家是否就可以理解,為什么很多網(wǎng)站在讓我們輸入密碼的時(shí)候 ,要求包含 大小寫(xiě)+符號(hào)+ 字母 + 數(shù)字 了吧。本質(zhì)上就是為了防止被輕松解密。
而服務(wù)端拿到的就是 “E1FC8CB7B54BED0FDC8711530236BA4D” 這樣的一個(gè)加密后的結(jié)果。然后服務(wù)端再次對(duì)密碼進(jìn)行加密操作,從而得到的是一個(gè) 被多次加密 的數(shù)據(jù),保存到服務(wù)端。
所以說(shuō):網(wǎng)站無(wú)法告知你密碼,因?yàn)樗膊恢涝艽a是什么。
目前很多網(wǎng)站或應(yīng)用為了保證用戶安全,都已經(jīng)采取 掃碼登錄、驗(yàn)證碼登錄 等方式進(jìn)行登錄驗(yàn)證,這種無(wú)密碼的方式,會(huì)更大程度的保證你的賬號(hào)安全。


