【问题标题】:Generating a Random Salt and use it in Bcrypt [duplicate]生成随机盐并在 Bcrypt 中使用它 [重复]
【发布时间】:2017-06-28 17:32:13
【问题描述】:

我正在尝试生成用于散列密码的随机盐。 我对密码散列有点陌生,但据我所知,当使用 BCrypt 算法时,你会得到一个 60 个字符长的散列字符串。

这 60 个字符中的 22 个字符应该是盐值,它被添加到生成的哈希值之前。

我使用了一个简单的代码来确保随机生成的盐与将要添加到实际哈希中的盐相同:

$salt = substr(strtr(base64_encode(openssl_random_pseudo_bytes(22)), '+', '.'), 0, 22);
echo "Salt Value is: ".$salt . "\n";

输出是:盐值是:XKFB8DHMiXaYTzRAHtRhX7

然后我使用生成的相同盐对密码进行了加密,如下所示:

$cost = 8; 
$EncryptedPassword = password_hash($Password, PASSWORD_BCRYPT, ['cost' => $cost,'salt' => $salt]);
echo "Encrypted Password: " . $EncryptedPassword . "\n";

输出不是我预期的:

加密格式:$2y$10$XKFB8DHMiXaYTzRAHtRhXutlLLG8XIZjj5XGeyoUZobEtnkOn/M/S 结果盐不是我用于散列的盐,即盐值的最后一个字符总是不同的。

随机生成的盐为:XKFB8DHMiXaYTzRAHtRhX7

得到的盐值是:XKFB8DHMiXaYTzRAHtRhXu

我的问题是可能是什么问题,我怎样才能在不更改密码哈希字符串的情况下获得嵌入在密码哈希字符串中的相同随机生成的盐值?

【问题讨论】:

标签: php random hash bcrypt salt


【解决方案1】:

password_hash()password_verify() 用于PHP 更简单、更安全。

使用 CRYPT_BLOWFISH 算法创建散列。这将使用“$2y$”标识符生成一个标准的 crypt() 兼容散列。

不需要提供盐,最好不要提供,在 PHP 7.x 中,盐选项已被删除。

例如:password_hash("aPassword", PASSWORD_BCRYPT)

【讨论】:

  • 我正在尝试使用以下代码来确保在哈希中使用相同的盐:<?php $binarySalt = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM); $salt = substr(strtr(base64_encode($binarySalt), '+', '.'), 0, 22); $Password="test"; echo nl2br ("Salt Value is: " . $salt . "\n"); $cost=8; $EncryptedEnteredPassword = password_hash($Password, PASSWORD_BCRYPT, ['cost' => $cost, 'salt' => $salt]); echo nl2br("Encrypted Password: " . $EncryptedEnteredPassword . "\n"); ?> 最后一个盐字符不同
  • 重点是不能用同一种盐,为什么要用同一种盐呢?
  • 我没有使用它,我只是回应了它,以便我可以验证发生了什么。我只需要知道为什么我得到一个不同的盐的最后一个字符
猜你喜欢
  • 2023-04-06
  • 1970-01-01
  • 2012-07-05
  • 1970-01-01
  • 2015-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多