因此,我目前正在學習 SpringBoot,現在我正在嘗試將密碼與用戶的其他數據一起存儲在數據庫 (MySql) 中。為了確保安全,我使用加鹽哈希來存儲。生成這些散列并將它們存儲在數據庫中工作正常,但是當我嘗試通過獲取鹽和密碼來驗證密碼時,我得到了不同的散列,因此得到了錯誤的結果。下面是我的代碼。第一個:User我開始驗證的類@Entitypublic class User {@Id@GeneratedValue(strategy = GenerationType.SEQUENCE)private long uID;@NotNullprivate String nname;@NotNullprivate String vname;private String email;private String telnr;@Embeddedprivate Address address;@NotNullprivate boolean isAdmin;private String hash;// Default Constructorpublic User() {}// Constructorpublic User(String name, String vname, String email, String telnr, Address address, boolean isAdmin, String password) throws NoSuchAlgorithmException { HashHelper hashHelper = new HashHelper(); this.nname = name; this.vname = vname; this.email = email; this.telnr = telnr; this.address = address; this.isAdmin = isAdmin; this.hash = hashHelper.createHash(password);}public boolean validateHash(String password) { HashHelper hashHelper = new HashHelper(); // Get the used Salt String[] parts = this.hash.split(":"); byte[] salt = parts[0].getBytes(); // Create Hash with old salt String newHash = hashHelper.getHash(password, salt); if (parts[1] == newHash) { return true; } return false;}其次,在我的課程HashHelper中,我處理與散列有關的所有事情。createHash每當存儲新密碼(因此,新鹽)并getHash使用特定鹽進行驗證時,我都會使用。
1 回答

RISEBY
TA貢獻1856條經驗 獲得超5個贊
您的問題沒有實際意義,因為您不應該使用此算法來散列密碼,因為它不安全。即使你沒有保護任何重要的東西,用戶也可能在多個地方使用相同的密碼,當攻擊者破解你不安全的密碼表時,他們將能夠在其他地方使用其中的許多密碼。
使用 Argon2,或至少使用 PBKDF2 來散列密碼,至少進行 10,000 輪散列。
您在這里遇到麻煩的原因是您沒有存儲用于散列密碼的鹽。沒有它,您將永遠無法計算出相同的哈希值。問題salts.toString()
出在createHash()
方法上:
hash=salts.toString() + ":" + sb.toString();
調用toString()
abyte[]
不會告訴您有關數組內容的任何信息。這就是為什么您不厭其煩地將摘要的結果 轉換bytes
為十六進制的原因。你應該做一些類似于鹽的事情。
同樣,調用getBytes()
字符串只是使用您平臺的默認編碼對字符串進行編碼。那不是你想要的。
確保equals()
在比較String
實例時使用他們的方法。==
操作員只會告訴您它們是否是相同的實例。
當存儲字節數組時,您仍然需要使用良好的哈希算法來完成,我建議使用 base-64,因為它在 中有很好的支持java.util.Base64
,并且它會產生更緊湊的數組編碼。
添加回答
舉報
0/150
提交
取消