2016-05-21 29 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是一个受欢迎的选项。