2012-01-05 24 views
-1

我在春季安全中編寫了一個哈希碼隱藏方法。在這種方法中,我將在數據庫中保存salt值和迭代大小。當用戶使用純密碼登錄時,下次我將使用鹽值和從數據庫迭代並消化密碼。但是,即使鹽和迭代值相同,此方法也會生成不同的哈希碼。爲什麼Digester爲同樣的消息,代碼和迭代生成不同的哈希碼

public Administrator encryptDigestCode(Administrator administrator) { 
    StandardStringDigester digester = new StandardStringDigester(); 
    Administrator admin = new Administrator(); 
    digester.setAlgorithm("SHA-256"); 
    digester.setStringOutputType("base64"); 
    Random ran = new Random(); 
    int iterate = ran.nextInt(1000); 
    digester.setIterations(iterate); 
    RandomSaltGenerator ram = new RandomSaltGenerator(); 
    byte[] salt = ram.generateSalt(10); 
    String pass = new String(salt) + administrator.getHashedPassword(); 
    String encryptedPassword = digester.digest(pass); 
    if (digester.matches(administrator.getHashedPassword(), 
      encryptedPassword)) { 
     admin.setLoginDetail(new LoginDetail()); 
     admin.getLoginDetail().setSalt(new String(ram.generateSalt(10))); 
     admin.getLoginDetail().setHashingCycle(iterate); 
     admin.setUserName(administrator.getUsername()); 
     admin.setSesamiagreementno(administrator.getSesamiagreementno()); 
     admin.setHashedPassword(encryptedPassword); 
    } else { 
     admin.setLoginDetail(null); 
     admin.setHashedPassword(null); 
     admin.setUserName(null); 
    } 
    return admin; 
} 

我應該怎麼做?任何代碼或網站以供參考。謝謝

+0

您將不得不張貼真實的代碼,而不是每次調用時都會生成一個新的隨機鹽的代碼。 – 2012-01-05 23:31:26

+0

OK,-1不指定鹽的存儲方式。 – 2012-01-09 20:53:29

回答

0

看起來像你使用隨機鹽。當然,哈希總是不同的。


而且還有一個第二隨機值

Random ran = new Random(); 
int iterate = ran.nextInt(1000); 
digester.setIterations(iterate); 

我希望,這也進水的結果。所以,如果你沒有運氣,那麼得到相同的隨機值兩次,哈希是不同的。

+0

hi ralph,是的,我使用隨機salt.but這個值將被保存在數據庫中,當用戶下次登錄時。我將在數據庫中獲得鹽值並添加明文密碼用戶輸入然後進行摘要。但我保存在數據庫中的散列碼與我第二次生成時的散列碼不同 – sudo 2012-01-05 09:03:13

+0

@sudo:還有一個隨機值 - 請參閱我的擴展答案。順便說一句我有這樣的感覺,有一些錯誤:鹽需要被添加到密碼之前哈希被計算 - 但我可能不理解代碼正確 – Ralph 2012-01-05 11:02:10

0

admin.getLoginDetail().setSalt(new String(ram.generateSalt(10)));

是錯誤的。首先,它會生成一個新的隨機鹽,並將其放入數據庫而不是使用變量salt。即您可以調用generateSalt兩次:第一個結果用於散列密碼,第二個結果存儲在數據庫中。其次,它將一個隨機的字節數組轉換爲一個字符串。 除非您確定這些字節與可打印字符相對應,否則您應該在這裏使用base64編碼(當然,必要時也可以進行適當的解碼)。

同樣使用隨機整數進行迭代次數並不是一個好主意。迭代次數應該對一個計算成本昂貴的單個目標進行強力攻擊。如果你在這裏使用一個隨機數,那麼攻擊者可能會試圖找到迭代計數最低的用戶並開始攻擊這個密碼。

相關問題