2013-12-17 173 views
0

我的問題是我怎麼能檢查密碼已與Bcrypt.And如果是,讓Bcrypt什麼也不做,只留下密碼喜歡它is.I'm與Java(EE),彈簧工作加密後。BCrypt檢查是否已經加密?

public static String hashPassword(String userPassword) { 
    String bCrypt = null; 
    if (userPassword == null) 
     throw new NullPointerException("Input password for hashing was null."); 
    bCrypt = BCrypt.hashpw(userPassword, BCrypt.gensalt(12)); 
    return bCrypt; 
} 
+0

如何被存儲的值?成本和鹽儲存在哪裏? –

+0

這是我的代碼 'public static String hashPassword(String userPassword){ \t String bCrypt = null; \t if(userPassword == null) \t throw new NullPointerException(「哈希輸入密碼爲空」。 \t bCrypt = BCrypt.hashpw(的userPassword,BCrypt.gensalt(12)); \t回bCrypt; }' 所以我要檢查,如果我將哈希密碼是不是已經散列。 –

+0

所以你使用'jBCrypt'?你可能想把這些代碼放在原來的問題中;編輯您的問題可以添加*信息。 –

回答

1

一般來說,你不應該僅僅替換可以有任何值就像另一個密碼的字符串。問題是有人可能會輸入一個與你的bcrypt輸出格式相同的密碼,並且你將無法區分這兩者。

幸運 bcrypt函數的輸出是由一個版本的字符串,「鹽回合」,鹽和哈希,通過$分隔符包圍。因此,區分兩者的最佳方法是編寫符合下列輸出(從jBCrypt 0.3源)正則表達式:

rs.append("$2"); 
if (minor >= 'a') 
     rs.append(minor); 
rs.append("$"); 
if (rounds < 10) 
     rs.append("0"); 
rs.append(Integer.toString(rounds)); 
rs.append("$"); 
rs.append(encode_base64(saltb, saltb.length)); 
rs.append(encode_base64(hashed, bf_crypt_ciphertext.length * 4 - 1)); 
return rs.toString(); 

我不過多的建議你列添加到您的數據庫,指示在行上使用散列算法(如果有的話)。

0

沒有辦法檢查是否應用了bcrypt算法,因爲一個CAN可以創建一個密碼來重新組合一個bcrypt,但是你可以使用一個技巧:讓密碼不能超過40個字符,然後檢查密碼比如59個字符以上(或更好地調整你的邏輯),從而可以推斷出密碼了,還是不行,被bcrypted。