【问题标题】:Can I use this to generate a PHP CRYPT_BLOWFISH salt?我可以使用它来生成 PHP CRYPT_BLOWFISH 盐吗?
【发布时间】:2013-07-23 03:06:29
【问题描述】:

我基本上是在用这个:

$chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ./';
$numChars = strlen($chars);
$salt = '$2a$12$';

for($i = 0; $i 

可以用吗?

【问题讨论】:

  • 为什么不直接使用crypt()
  • 我正在使用crypt(),但最初您需要为要使用的加密算法生成盐。
  • 很公平。 @arxanas,你怎么知道的?
  • @JaredFarrish 他在问CRYPT_BLOWFISH 的盐怎么用,在crypt 中使用。
  • @arxanas - 但这意味着他正在使用crypt()(或bcrypt)?

标签: php salt blowfish


【解决方案1】:

对于 PHP 5.3.7 或更高版本,我相信这是最好的:

$blowfish_salt = "$2y$10$".bin2hex(openssl_random_pseudo_bytes(22));

对于 PHP 5.5 或更高版本,只需使用新的 password_hash() function 并自动创建盐。

【讨论】:

    【解决方案2】:

    很好用。不过,您在随机化盐方面工作得太辛苦了。
    你总是可以做一些像这样 $salt = md5(mt_rand()) :)
    当您想在下一步保存密码时,只需使用类似的东西。

        $encryptedPassword = crypt($userPassword, $salt);
    

    如果你有最新版本的 PHP,这应该默认为河豚

    【讨论】:

    • 我有 PHP 5.3,它默认我为 MD5 -_-'
    • “最新”太模糊了;这是“危险的”。没有“太努力”。
    • @JaredFarrish 是的:这就是所谓的重新发明轮子。
    • 抱歉,最新的意思是 5.3.7+
    • @arxanas - 重读评论;这是肉酱。 PHP Blowfish 算法在某些版本中存在一些问题。密码哈希的全部“重点”是使数据“恢复”(通过彩虹或其他暴力方法)尽可能难以恢复。
    【解决方案3】:

    我不知道它是否可以使用,但由于mt_rand 是基于系统时间的,所以它是可以预测的。最好使用高级随机生成算法,如 openssl_random_pseudo_bytes/dev/random 实用程序(如果可用)。

    见:https://stackoverflow.com/a/6337021/454533

    【讨论】:

      【解决方案4】:

      使用 Blowfish,您只需要 21 个字符来添加盐,其余的都被遗忘了。

      这部分$2a$12$ 不是盐,它的算法和成本(哈希迭代)。

      您的盐可以通过 sha1 简单地制作,然后返回前 21 个字符:

      $salt = substr(sha1($_SERVER['HTTP_HOST'].uniqid().microtime(true)),0,21);

      比如:

      $algo = '$2a$12$'; //Keep this safe
      
      //store along side hash as the salt, for future compares
      $salt = substr(sha1($_SERVER['HTTP_HOST'].uniqid().microtime(true)),0,21);
      
      $hash = crypt('The string to be hashed', $algo.$salt.'$');
      

      【讨论】:

      • 这是我不久前做的一个secure login class 示例,也许它很有趣,它使用了 sha512 @ 25k 次,哈哈,这在很大程度上是矫枉过正
      • 为什么多次使用 SHA512 会更安全?如果有的话,它应该更容易发生碰撞。
      • @arxanas 用于创建 慢散列 想象一下,您使用的散列函数在同一硬件上每秒只能运行 100 万次,而不是每次运行 10 亿次第二。然后攻击者将花费 25k 倍的时间来暴力破解哈希。 60 小时将变成近 171 年!
      • 澄清一下,只存储crypt()返回的值是可以接受的——它包含算法、哈希和盐。
      • 使用 sha1() 的问题是它只会返回字符 [0-9a-f] 而 CRYPT_BLOWFISH salt 可以使用 [0-9a-zA-Z./]。这有关系吗?
      猜你喜欢
      • 1970-01-01
      • 2012-07-05
      • 2016-02-13
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      • 2011-09-07
      相关资源
      最近更新 更多