2016-05-21 71 views
0

我剛開始玩的Grails和簡單的註冊/登錄功能工作。 我有這個簡單的域對象:Jasypt加密領域和標準API沒有得到結果(Grails的)

class Person { 

    String firstName, lastName, email 
    String login, password 

    static constraints = { 
     firstName nullable: true 
     lastName nullable: true 
    } 
    static mapping = { 
     password type: GormEncryptedStringType 
    } 
} 

我節省Person對象就好了。但後來當我試圖找回它使用標準API登錄的目的,也不會找到它:

def criteria = Person.createCriteria() 
def person = criteria.get { 
    and { 
     eq("login", params.login) 
     eq("password", params.password) 
    } 
} 

如果我刪除eq("password", params.password)或將它更改爲不加密的它工作得很好。任何人都有一個想法如何處理?

回答

0

你做錯了(安全)。你不加密密碼,你把它們加密。散列是單向和有損,而加密是雙向的,無損的,但如果你能解密密碼,那麼你就容易受到誰獲得的解密密鑰攻擊,然後他們就可以解密他們太。

如果使用散列,那麼你可以(當然不應該)讓任何人查看散列密碼,因爲如果你使用一個很好的散列方案,他們是無用的。 Bcrypt是最好的之一,易於使用。

相反解密所述存儲的加密密碼,以驗證來自用戶的認證嘗試明文口令的,則應該散列提供的密碼和驗證它與存儲的哈希密碼。對於某些算法來說,這很簡單,因爲檢查值是相同的,但Bcrypt並非如此,因爲算法總是爲每次調用生成不同的哈希值。但算法可以驗證兩個哈希密碼,所以這不是問題。

所以真正的解決你的問題是停止使用加密,並停止'滾動自己的安全。 spring-security-core是一個受歡迎的選項。