【问题标题】:Am I using CRYPT_BLOWFISH correctly in PHP?我在 PHP 中正确使用 CRYPT_BLOWFISH 吗?
【发布时间】:2012-05-20 11:19:22
【问题描述】:

我将把它用于用户密码系统,但我首先要确保我做得正确。这是我的测试代码:

函数 generateBlowfishSalt() {
    $chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ./';
    $numChars = strlen($chars);
    $盐='';

    for($i = 0; $i ', $password);
printf('salt: %s', $salt);
printf('hash1: %s', $hash1);
printf('hash2: %s', $hash2);
printf('比较:' .$compare);

这是一个示例输出:

密码:foo
盐:MYVJ32OqLcMGBar3pUa.0S
hash1: $2a$12$MYVJ32OqLcMGBar3pUa.0OTRwv6UX0bcxnSmheKOcqjvqvCrM/p2q
hash2: $2a$12$MYVJ32OqLcMGBar3pUa.0OTRwv6UX0bcxnSmheKOcqjvqvCrM/p2q
比较:1

我的主要问题是:

  1. 我是否正确生成了 22 个字符的盐?我见过的一些实现使用base64_encode() 来生成盐。我需要这样做吗?

  2. 将整个$hash1 值存储在数据库中并且不存储单独的盐值是否正确,因为$hash1 将包含盐值,而这就是我验证密码所需的全部内容?

  3. 在 PHP crypt() 文档页面上,CRYPT_BLOWFISH 示例有一个用于 salt 参数的结尾 $(它是:'$2a$07$usesomesillystringforsalt$')。但在所有示例中,我看到没有人使用尾随$。是可选的吗?

谢谢

【问题讨论】:

    标签: php blowfish


    【解决方案1】:

    你做的盐是正确的。只是必须是随机的。有许多不同的方法可以随机生成这个。除了日期时间等之外,有些人还使用它。此外,更长的盐并不意味着什么,因为无论如何它都会被切断。它需要一定的长度,至少就 crypt() 而言。因此,如果一点额外的填充让您感觉更好,那就去吧。

    您假设将盐存储在数据库中。起初我很难理解这一点。加盐的全部目的只是让用大量可能的密码列表彩虹表所需的时间更长。更正,此外,它还有助于 2 个或多个相同的密码,这是必然发生的。如果是这样,由于随机盐,哈希仍然会有所不同。

    至于 crypt() 继续测试它,直到它看起来和 PHP 的 php DOC 中的长度相同,但是它看起来是正确的。

    【讨论】:

    • 盐不是随机的吗?我使用 mt_rand() 来生成它。我认为我不需要在 crypt() 返回的值之上存储单独的盐值,因为 crypt() 返回的值几乎包含了整个盐值。此外,我只需要第一次调用 crypt() 返回的值来验证密码。
    • 是的,您不需要做任何额外的事情。你正在生成随机盐。我很确定我说“你正在正确地做盐”。只是重申一下。你有正确的想法。
    猜你喜欢
    • 1970-01-01
    • 2013-05-11
    • 2012-07-23
    • 1970-01-01
    • 2014-02-28
    • 2015-06-25
    • 2022-01-08
    • 2011-08-07
    • 2011-09-26
    相关资源
    最近更新 更多