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

Jer*_*via 3 phpunit zend-framework

现在我正在使用Zend Framework并搞乱那个和phpunit.这是我的困境.

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

protected function _createPasswordDbExpression( $password )
{

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

    return $binaryPassword;
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我一直在使用xml数据集来指定预期的结果,但现在,使用散列密码,我不知道该怎么做.

我看到了解决方案,但必须有更好的方法.

我可以预先输入密码或密码,并且只在我的测试期间和我的xml文件中使用它.

还有其他解决方案可能更好,更可测试吗?

当phpunit尝试直接插入"哈希"密码时,我不确切知道这个二进制列会如何影响事情.

irc*_*ell 6

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

一旦你使它成为一个PHP函数,单元测试是微不足道的(只需使用多个标准测试向量中的任何一个来确保它被正确地散列.

但是,我强烈建议使用salt和派生函数来安全地存储密码.你可以在这个答案中看到原因.就确切的算法而言,我建议实施PBKDF2.我有一个PHP实现,你可以在这里进行逆向工程(这个库尚未生产,但该算法是).

最后,我建议使用SHA2算法之一而不是SHA1(SHA256或SHA512就足够了).它更具抗碰撞性,往往被视为明显更强......