1

我正在尝试使用 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 对象,并手动填充它的值。所以密码没有经过哈希处理,并且具有“秘密”值。因此,当我尝试测试登录功能并使用 BCrypt.checkpw() 时,它会将“secret”与“secret”进行比较,而不是将“secret”与“-bcryptsalt+hashedpassword”进行比较,这就是它给出错误“salt version invalid”的原因',因为 'secret' 没有所需的盐形式等。

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

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

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

4

1 回答 1

1

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

于 2013-03-22T15:49:30.907 回答