2016-07-04 39 views
0

我將Spring Security的Bcrypt密碼編碼器集成到一個新的應用程序中,並且在測試過程中我注意到當使用兩個不同的編碼器匹配密碼時,工作負載似乎沒有影響工作因素。舉例如下:Spring Security BCrypt密碼編碼器 - 工作負載因子

public static void main(String[] args) { 
    PasswordEncoder strongEncoder = new BCryptPasswordEncoder(12); 
    PasswordEncoder weakEncoder = new BCryptPasswordEncoder(6); 

    String password = "[email protected]@"; 

    String strongEncodedPass = strongEncoder.encode(password); 
    String weakEncodedPass = weakEncoder.encode(password); 

    //Prints true 
    System.out.println(weakEncoder.matches(password, strongEncodedPass)); 
    //Prints true 
    System.out.println(strongEncoder.matches(password, weakEncodedPass)); 
} 

由於編碼器使用不同的工作負載,不應該同時打印語句結果爲false?

將上述樣品中的Java 8

回答

0

讀取源代碼使用彈簧安全核心4.1.0.RELEASE.jar測試,生成所述鹽時強度時才使用。加密算法本身所使用的回合數被硬編碼爲16.

所以你看到的是預期的。不知道爲什麼Spring不允許爲加密部分選擇多輪。在bug /功能請求中可能值得指出,因爲文檔確實令人困惑。

2

如果你看一下在BCrypt(https://en.wikipedia.org/wiki/Bcrypt)維基百科的文章,你會發現,哈希的格式包含輪

例如數量,影子密碼記錄$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy指定一個成本參數10個,表明210個關鍵擴張輪。該鹽是N9qo8uLOickgx2ZMRZoMye並且得到的散列是IjZAgcfl7p92ldGxad68LJZdL17lhWy。

因此,如果密碼與散列相匹配,則散列的次數與原始散列相似。

換句話說:在matches()是獨立設置的,而且很可能是靜態的......