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

时间:2011-04-01 03:41:10

标签: zend-framework phpunit

现在我正在使用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;
}

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

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

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

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

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

1 个答案:

答案 0 :(得分:6)

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

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

但是,我高度建议使用salt和派生函数来安全地存储密码。你可以看到为什么in this answer。就确切的算法而言,我建议实施PBKDF2。我有一个PHP实现,你可以反向工程,如果你想here(该库尚未生产,但该算法是)。

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