Zend framework 使用散列密码进行单元测试

Zend framework 使用散列密码进行单元测试,zend-framework,phpunit,Zend Framework,Phpunit,现在,我正在使用Zend框架,并将其和phpunit混为一谈。这是我的困境 当我创建一个用户时,我在用户表中散列密码。我添加了两种盐,一种是来自应用程序的静态盐,另一种是随机生成的盐。我使用database SHA函数,然后取消该函数,将密码存储在一个二进制列中。为了告诉数据库如何散列密码,我使用Zend_Db_Expr,如下所示: protected function _createPasswordDbExpression( $password ) { $quoted = $this

现在,我正在使用Zend框架,并将其和phpunit混为一谈。这是我的困境

当我创建一个用户时,我在用户表中散列密码。我添加了两种盐,一种是来自应用程序的静态盐,另一种是随机生成的盐。我使用database SHA函数,然后取消该函数,将密码存储在一个二进制列中。为了告诉数据库如何散列密码,我使用Zend_Db_Expr,如下所示:

protected function _createPasswordDbExpression( $password )
{

    $quoted = $this->getDbTable()->getAdapter()->quoteInto( 'UNHEX( SHA1( ? ) )', $password );
    $binaryPassword = new Zend_Db_Expr( $quoted );

    return $binaryPassword;
}
到目前为止,我一直在使用xml数据集来指定预期的结果,但是现在,使用哈希密码,我不知道该怎么做

我看到了一个解决办法,但必须有更好的办法

我可以预先设置一个或多个密码,并且只能在测试期间和xml文件中使用

还有其他更好、更易测试的解决方案吗


我不知道当phpunit试图直接插入一个“散列”密码时,这个二进制列究竟会有什么影响。

首先,永远不要这样做。任何有权访问数据库查询历史记录的人都可以看到原始密码(它们将存储在二进制日志中)。相反,在应用程序中对它们进行散列,以便销毁原始密码。这样,数据库功能就变成了一个值存储,而不是需要单元测试的东西

一旦您将它变成一个PHP函数,就不需要进行单元测试(只需使用标准中的任意一个来确保正确地对其进行散列)

然而,我强烈建议使用salt和派生函数来安全地存储密码。你可以看到原因。至于确切的算法,我建议实现。我有一个PHP实现,如果你愿意,你可以进行反向工程(库还没有准备好生产,但算法已经准备好)


最后,我建议使用SHA2算法中的一种来代替SHA1(SHA256或SH512都应该足够了)。它更耐碰撞,而且往往被认为更强大……

感谢您的提示,这帮助我使代码更易于测试。