亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java/SpringBoot:驗證加鹽哈希返回錯誤的哈希

Java/SpringBoot:驗證加鹽哈希返回錯誤的哈希

絕地無雙 2022-12-28 16:24:23
因此,我目前正在學習 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,并且它會產生更緊湊的數組編碼。


查看完整回答
反對 回復 2022-12-28
  • 1 回答
  • 0 關注
  • 112 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號