PHP crypt 和 salt - 请详细说明

标签 php encryption salt mcrypt

我昨天来过这里,得到了一些非常好的答案。我把我得到的东西放在一起,我认为这将是一个相当安全的算法。我在使用带有生成盐的 for 循环的河豚时遇到问题。

我使用 base64 字符和 for 循环来获取随机字符串。我想将这个生成的字符串作为盐插入到 crypt 函数中。

因为关于河豚的文档非常少,而且 PHP 文档甚至都没有提到它,所以我在这里有点摸不着头脑。

真正奇怪的是,如果您按现在的方式运行这段代码,它不会失败。从 crypt 函数中移除 for 循环上方的“$2a$07$”,它将间歇性地返回一个加密字符串。我对河豚的理解是加密字符串必须以“$2a$07$”开头并以“$”结尾,因此在 crypt 函数中连接。我真的不需要上面的开头字符串for 循环,只是想摆脱它。

我还想澄清有关存储随机盐的最佳做法,是在数据库中还是通过将 crypt 函数的输出存储在数据库中?

昨天,没有真正的代码被抛出,只是讨论。今天我想将一些代码放在一起,并准备一些相当安全的东西。如果有人能想出更好的算法,我总是持开放态度。

$base64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
$salt = '$2a$07$';

for($i=0; $i<60; $i++)
{
    $salt .= $base64[rand(0,63)];
}

return crypt('password', '$2a$07$'.$salt.'$');

最佳答案

似乎 crypt() 不喜欢 salt 中的 + 字符,还有很多其他特殊字符 (*, % 等)。如果您将它们过滤掉,它应该在每次尝试时都能正常工作(并且无需重复 salt id 字符串)。

关于PHP crypt 和 salt - 请详细说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2192354/

相关文章:

encryption - 哈希盐除了防止彩虹表攻击之外还有其他用途吗?

php - 社会保障/政府 ID 号的哈希和盐的替代方案

php - 查找字符串中的最后一个数值

javascript - 页面加载时如何在jquery中获取增量值

php - Laravel 使用 key 解密

.net - ASP.NET Core - 将加密 key 存储到 Redis

encryption - 加密存储在远程后端(如 GCS 存储桶)上的 Terraform 状态是否有用?

java - 在数据库中存储盐 - 字符还是二进制?

php - Laravel Forge 将非 www 重定向到 www

javascript - 是否可以在加载时从 iFrame 中的 <head> 修改外部源