2011-04-29 131 views
3

我在我的Spring應用程序中使用Apache Shiro作爲我的安全層,而且遇到了一個非常奇怪的情況。哈希和鹽漬密碼並不總是相同

首先,這是我的安全系統設置的方式。當用戶註冊他們的密碼時,會使用安全生成的隨機鹽進行散列。鹽和哈希密碼然後存儲在我的數據庫中。當他們註冊並登錄時,一切都可以正常工作,但是過了幾天,突然他們的哈希密碼不再匹配。這裏是我的代碼:

import org.apache.shiro.codec.Base64; 
import org.apache.shiro.crypto.hash.Sha256Hash; 

public static void main(String[] args) { 
     String plainPassword = "testing"; 
     String salt = "8AFTpriREtydSg39+37rQHNRyvZLuXqyXYgWXI55f1PbhbUQSeFGCLKsHpA6thZKs3uQeNNJHksqcV5oaNcr9lQiXMMyC8Duqr2aQaqyjLKpNMVlB69jJ7emNq0K6ccfBdv/O4JGT2U689LeNg6CqN+9kqW2GBgT2CIVOlapA34="; 

     System.out.println(new Sha256Hash(plainPassword.toCharArray(), Base64.decode(salt), 1024).toBase64()); 
} 

產生的哈希密碼是:

b8VLt/eKV8F5kwDjRgdkM+PAvQC8sk7Ooflt91juaXA= 

但密碼我在我的數據庫,這是工作和前兩天是完全相同的鹽生成是:

xZNBNlUa8vRQq0qY5bbkETzZtzztGRTH2KZKijQdilU= 

所以,你可以想象,我完全難倒了。有誰知道我是否做錯了什麼?或者如果我離開了一步。

更新1:在我的系統中註冊一個新用戶後,它看起來像系統中的所有其他用戶由於某種原因而更改其密碼。因此,這與密碼哈希的生成方式無關,並且更多與我的數據庫訪問層有關。

+0

嗯,我們不能看到你做錯了什麼,因爲你沒有告訴我們:)其他密碼不是用相同的程序生成的_OR_它被複制了錯誤 – sehe 2011-04-29 12:37:42

+2

是用於生成密碼的代碼是否存儲在DB *相同*上面的?如果是,那麼您必須更改服務器上的Shiro版本,更改存儲在數據庫中的密碼或更改服務器上的哈希代碼。 – Borealid 2011-04-29 12:39:52

+0

@Boarealid:看起來你是對的。我剛剛更新了我的帖子。它看起來像是我的一段代碼正在改變數據庫中的密碼,現在要跟蹤它。 – 2011-04-29 12:50:25

回答

0

事實證明,我在其他地方有一些狡猾的代碼更新我的用戶對象並用新密碼覆蓋他們的密碼。所以密碼哈希算法畢竟工作正常。

1

看來你的問題與散列和醃製無關。您正在發送更新不需要的記錄的不當查詢。

但我會提出一個關於醃製的建議 - 爲每個用戶使用不同的鹽。否則,你的密碼不夠安全。想象一下,如果有人獲得鹽和數據庫會發生什麼。在一段時間(可能是幾周,但它不是那麼多),他將能夠生成彩虹表並擁有大部分密碼。如果您使用不同的鹽,他將不得不生成與您的用戶數量一樣多的彩虹表。

+0

感謝您的提示,但我已經爲每個用戶使用了不同的鹽。此刻,我正在追查我的問題,看看發生了什麼。 – 2011-04-29 13:00:10