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