面試揭秘:忘記密碼時(shí)為何要重置,而非直接告知?
最近,一個(gè)朋友在面試中遇到了一個(gè)非常有趣的問(wèn)題。我相信大多數(shù)朋友可能沒有遇到過(guò)。
面試官問(wèn):“為什么很多網(wǎng)站在忘記密碼時(shí)要求重置密碼,而不是直接告訴用戶原始密碼?” (⊙?⊙)?
這是個(gè)很有趣的問(wèn)題,對(duì)吧?許多網(wǎng)站都有“忘記密碼?”的功能,但為什么當(dāng)我們點(diǎn)擊“忘記密碼”并經(jīng)過(guò)一系列驗(yàn)證后,網(wǎng)站會(huì)讓我們重置密碼,而不是直接告訴我們?cè)济艽a呢?
今天,我們就來(lái)談?wù)勥@個(gè)問(wèn)題。
防止信息泄露
對(duì)大多數(shù)人來(lái)說(shuō),為了防止忘記過(guò)多密碼,很多時(shí)候大家都會(huì)使用統(tǒng)一的密碼!也就是說(shuō),您的多個(gè)賬戶可能都有相同的密碼。因此,一旦密碼泄露,可能會(huì)影響到您的多個(gè)賬戶,甚至是銀行卡賬戶。
因此,對(duì)于網(wǎng)站(尤其是一些大型網(wǎng)站)來(lái)說(shuō),保護(hù)用戶數(shù)據(jù)安全是極其重要的事情。
所以,您在網(wǎng)站上保存的數(shù)據(jù)可能并不是那么安全。
對(duì)大多數(shù)人來(lái)說(shuō),最相關(guān)的經(jīng)驗(yàn)(網(wǎng)上見過(guò))應(yīng)該是詐騙電話。他們甚至可以非常清楚地告訴您所有個(gè)人信息。那么,這些信息從哪里來(lái)呢?
主要是由于數(shù)據(jù)泄露,所有您的個(gè)人信息都被他人知道。
那么,一般網(wǎng)站如何防止數(shù)據(jù)泄露呢?
通常的方法是加密。而且這種加密可能在不同階段進(jìn)行多次。例如,常見的有:SHA256、加鹽、MD5、RSA等。
這看起來(lái)非常安全,但仍然存在一個(gè)問(wèn)題。開發(fā)者知道如何解密它們。
或者有些朋友會(huì)認(rèn)為,正確的密碼仍然存在于數(shù)據(jù)庫(kù)中?一旦發(fā)生信息泄露,不是仍然存在密碼泄露的問(wèn)題嗎?
是的,因此為了解決這個(gè)問(wèn)題,實(shí)際上,網(wǎng)站本身并不知道您的密碼是什么。
網(wǎng)站本身并不知道您的密碼是什么
對(duì)于網(wǎng)站(或其他應(yīng)用程序)來(lái)說(shuō),它們不應(yīng)該存儲(chǔ)您的原始密碼。相反,它們通過(guò)一系列操作保存您的加密代碼。而且這種加密在從前端傳輸?shù)椒?wù)器時(shí)已經(jīng)執(zhí)行,而且它是不可逆的加密操作,例如:MD5 + 加鹽。
一般來(lái)說(shuō),我們通過(guò)哈希算法對(duì)密碼進(jìn)行加密和保存。
圖片
哈希算法,也稱為哈希函數(shù)或摘要算法,用于生成任意長(zhǎng)度數(shù)據(jù)的固定長(zhǎng)度唯一標(biāo)識(shí)符,也稱為哈希值或消息摘要(后文簡(jiǎn)稱哈希值)。
目前,較常用的方法是通過(guò)MD5 + Salt加密密碼。在密碼學(xué)中,加鹽指的是在密碼的任意固定位置插入特定字符串,以使哈希后的結(jié)果與使用原始密碼的哈希結(jié)果不匹配。這個(gè)過(guò)程稱為“加鹽”。
然而,這種方法現(xiàn)在不再推薦,因?yàn)镸D5算法安全性低,抗碰撞能力差。您可以使用更安全的加密哈希算法 + Salt(如SHA2、SHA3、SM3,具有更高的安全性和更強(qiáng)的抗碰撞能力),或者直接使用慢哈希(如Bcrypt)。
假設(shè)我們?cè)谶@里使用SHA-256 + Salt的方法。
以下是一個(gè)簡(jiǎn)單的示例代碼:
publicclassHashPasswordExample{
publicstaticvoidmain(String[] args){
// 要哈希的密碼
String password ="123456";
// 哈希的鹽
String salt ="salt-test";
try{
// 創(chuàng)建SHA-256摘要對(duì)象
MessageDigest messageDigest =MessageDigest.getInstance("SHA-256");
// 更新摘要與組合的密碼和鹽
messageDigest.update((password + salt).getBytes());
// 計(jì)算哈希值
byte[] result = messageDigest.digest();
// 將哈希值轉(zhuǎn)換為十六進(jìn)制字符串
HexBinaryAdapter hexBinaryAdapter =newHexBinaryAdapter();
String hexString = hexBinaryAdapter.marshal(result);
// 打印原始密碼
System.out.println("原始字符串: "+ password);
// 打印SHA-256哈希值(小寫)
System.out.println("SHA-256哈希: "+ hexString.toLowerCase());
}catch(Exception e){
e.printStackTrace();
}
}
}
輸出:
原始字符串: 123456
SHA-256哈希: 3d5ecd90301b307c267f1c09e8a4b2433c2258fcb7441df91a32e245ea86bf96
在這個(gè)示例中,服務(wù)器保存的是對(duì)密碼“123456”進(jìn)行加鹽和哈希后的數(shù)據(jù),即:“3d5ecd90301b307c267f1c09e8a4b2433c2258fcb7441df91a32e245ea86bf96”。
圖片
當(dāng)您輸入密碼進(jìn)行登錄時(shí),服務(wù)器會(huì)首先取出與您的密碼對(duì)應(yīng)的鹽,然后再進(jìn)行一次獲取哈希值的過(guò)程。如果最后計(jì)算出的哈希值與數(shù)據(jù)庫(kù)中保存的哈希值相同,則表示密碼正確。否則,密碼錯(cuò)誤。
哈希算法是不可逆的。您無(wú)法從哈希值中獲得原始值。通過(guò)這種方式,服務(wù)器并不知道您的原始密碼,自然也無(wú)法告訴您原始密碼是什么。
為什么許多網(wǎng)站要求更改密碼時(shí)不能與原密碼相同?
然后有些朋友會(huì)再次產(chǎn)生疑問(wèn)。為什么許多網(wǎng)站要求更改的密碼不能與原密碼相同?這是如何實(shí)現(xiàn)的?
這個(gè)過(guò)程實(shí)際上與驗(yàn)證密碼的正確性是相同的。只需計(jì)算哈希值并進(jìn)行比較即可!
結(jié)論
通過(guò)以上分析,我們可以清楚地看到,網(wǎng)站要求用戶在忘記密碼時(shí)重置而非直接告知原始密碼的做法,主要是出于對(duì)用戶信息安全的深刻考量?,F(xiàn)代網(wǎng)站采用的加密措施,確保了即使數(shù)據(jù)泄露,黑客也難以獲取用戶的真實(shí)密碼。此外,密碼重置的流程不僅增加了用戶的安全性,也維護(hù)了整個(gè)系統(tǒng)的安全性。網(wǎng)站不存儲(chǔ)原始密碼,而是以不可逆的加密形式保存,這樣一來(lái),即使系統(tǒng)遭到攻擊,用戶的敏感信息依然得以保護(hù)。最終,重置密碼的機(jī)制不僅保護(hù)了用戶的個(gè)人隱私,也提高了對(duì)網(wǎng)絡(luò)安全的信任。面對(duì)日益復(fù)雜的網(wǎng)絡(luò)環(huán)境,我們每個(gè)用戶都應(yīng)增強(qiáng)自身的安全意識(shí),定期更新密碼,并了解如何合理使用各種網(wǎng)絡(luò)安全工具,以確保個(gè)人信息的安全和隱私。