播放2.1,BCrypt:在yml-parser生成User对象并插入密码值之前使用hash yml password属性

时间:2013-03-17 14:47:46

标签: playframework yaml bcrypt

我正在尝试使用play 2.1框架实现登录功能。起初我只使用明文存储密码(所有测试都成功),所以现在我使用JBcrypt库编写了一个增强功能。 我的代码应该是正确的(也是根据https://github.com/yesnault/Play20StartApp/tree/master/app中使用的原则)。然而,现在,当我尝试运行相同的登录测试用例时,它们会失败。 BCrypt给出了“无效的盐版本错误”。我一直在寻找原因,但我想我发现了问题。为了在执行测试之前获得一些初始测试数据,我加载了一个test-data.yml文件,其中一些用户被定义为:

- !!models.Person
    ID: 123
    lastName:  Tom 
    firstName:  Tom
    password:   secret

在我的Person类构造函数中,使用Bcrypt hashpw()方法对密码进行哈希处理,然后将哈希密码存储在用户对象中。然而现在的问题是(至少我认为),yaml解析器(?)不使用我的构造函数,只是创建一个空的Person对象,并手动填充其值。所以密码没有哈希值,并且值为'secret'。 那么当我尝试测试登录功能并使用BCrypt.checkpw()时,它会将'secret'与'secret'而不是'secret'比较为'-bcryptsalt + hashedpassword',这就是为什么它会给出错误'salt版本无效',因为'秘密'没有所需的盐形式等。

所以我的问题是: 是否可以在yml文件中调用方法? 例如:

- !!models.Person
    bebrasID:   123
    lastName:   Tom
    firstName:  Tom
    password:   BCrypt.hashpw('secret', BCrypt.gensalt())

或者有什么方法可以强制yml使用我的构造函数而不是手动填充值? 实际上,我只需要一个使用我的数据yml文件的方法在yaml将它存储在Person对象之前在明文密码上使用BCrypt?这可能吗?

1 个答案:

答案 0 :(得分:1)

我认为不可能在yml中调用函数,因为它只是一个“人类友好的数据序列化标准”,正如它在www.yaml.org中所说,你无法序列化函数。我建议您将散列密码放在yml中。只需在UnitTest中调用BCrypt.hashpw('secret',BCrypt.gensalt())并记录结果,然后确保它总是具有相同的结果,只需在yml中使用该文本。