2014-04-15 61 views
2

我想在我的Grails應用程序中使用Spring Security插件使用BCrypt密碼散列。我已通過添加以下內容Config.groovy使用Spring Security的BCrypt密碼散列Grails插件

grails.plugins.springsecurity.password.algorithm = 'bcrypt' 

啓用BCrypt我也定義瞭如下的編解碼器使用BCrypt編碼paswords簡化:當我開始開發模式的應用

public class PasswordCodec { 

    // it doesn't seem to be possible to dependency-inject codecs, so lookup the bean ourselves 
    @Lazy 
    private static PasswordEncoder passwordEncoder = Holders.grailsApplication.mainContext.getBean('passwordEncoder') 

    static encode = { str -> 
     passwordEncoder.encodePassword(str.toString(), null) 
    } 
} 

的數據庫自舉了幾個帳戶(其中的每一個具有相同的密碼,如

3.times { i -> 
    def username = "user$i" 
    def password = "secret".encodeAsPassword() 

    new User(username: username, password: password).save() 
    // also assign the user a role 
} 

如果我期待在數據庫中,我看到EA的編碼值這些用戶的密碼ch是不同的!因此,當用戶嘗試登錄並輸入密碼「secret」時,BCrypt編碼的密碼值與數據庫中保存的密碼值不匹配也就不足爲奇了,因爲似乎字符串的BCrypt編碼值以某種方式發生了變化隨着時間的推移。

顯然我在這裏做錯了事,但我不知道是什麼?

+0

我假設你的用戶域沒有處理密碼編碼的典型s2 quickstart代碼? –

+0

此外,我認爲現在默認情況下啓用了salting,這是基於用戶名的,因此對於每個密碼都是不同的salt:http://grails-plugins.github.io/grails-spring-security-core/docs/manual /guide/passwords.html#salt ...假設你仍然有生成的s2 quickstart代碼。 –

+0

@JoshuaMoore不,我沒有在用戶類本身做任何密碼編碼(我沒有使用s2-quickstart) –

回答

8

在給定相同輸入(並且偶爾使用不同輸入)的情況下,密碼哈希通常是相同的。但是bcrypt和其他人每次都會產生不同的散列。但這不是問題,因爲PasswordEncoder接口同時具有生成散列的String encodePassword(String rawPass, Object salt)方法,而且還有用於驗證它們的方法boolean isPasswordValid(String encPass, String rawPass, Object salt)

使用MD5,SHA-1等更簡單的散列,驗證過程只需重新編碼明文密碼並檢查它是否與存儲的散列值相同。 bcrypt的過程比較複雜,但最終結果是一樣的 - 它不檢查等於,而是他們是等價於。所以,如果你散列相同的密碼兩次,並將它們與isPasswordValid進行比較,它將返回true

+0

+1有關信息。謝謝,一如既往Burt! –

+0

這個棄用的PasswordEncoder與此[PasswordEncoder]不同(http://docs.spring.io/spring-security/site/docs/3.2.x/apidocs/org/springframework/security/crypto/password/PasswordEncoder.html ),除了在前一種情況下由用戶提供鹽嗎? (出於問題的背景) – dmahapatro

+1

我沒有仔細觀察差異,但我正在計劃遷移到新的界面。 –

相關問題