【问题标题】:Unit testing with hashed passwords使用散列密码进行单元测试
【发布时间】:2011-04-01 21:09:06
【问题描述】:

现在我正在使用 Zend 框架和 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 尝试直接插入“散列”密码时,我不知道这个二进制列会如何影响事情。

【问题讨论】:

    标签: zend-framework phpunit


    【解决方案1】:

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

    一旦你把它变成一个 PHP 函数,单元测试就很简单了(只需使用标准 test vectors 的任何一个数字来确保它被正确地散列。

    但是,我强烈建议使用盐和派生函数来安全地存储密码。你可以看到为什么in this answer。至于确切的算法,我建议实施PBKDF2。我有一个 PHP 实现,如果你喜欢 here,你可以对其进行逆向工程(该库尚未准备好生产,但该算法已准备好)。

    最后,我建议使用其中一种 SHA2 算法而不是 SHA1(SHA256 或 SHA512 就足够了)。它更耐碰撞,并且往往被视为更强...

    【讨论】:

    • 感谢您的提示,这帮助我提高了代码的可测试性。
    猜你喜欢
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多