gpt4 book ai didi

php - 安全密码生成和存储

转载 作者:行者123 更新时间:2023-12-04 14:48:46 24 4
gpt4 key购买 nike

我正在构建一个登录系统,我想确保我正在编写代码来生成密码并将其存储在数据库中。 $options['passwd'] 是用户选择作为密码的字符串。

这是我生成哈希的代码:

public function createPasswd($options) {
$hash_seed = 'm9238asdasdasdad31d2131231231230132k32ka¡2da12sm2382329';
$password = $options['passwd'];
$date = new DateTime();
$timestamp = $date->getTimestamp();
$rand_number = rand($timestamp,$timestamp + pow(91239193912939123912,3));
$rand = pow($rand_number, 12);
$salt = str_shuffle($rand.$hash_seed);
$hash = crypt($password, $salt);
return $hash;
}//End class createPasswd

我只是将散列存储在数据库中,然后将其与用户密码进行比较,如下所示:

if ($hash == crypt($password, $hash)) {
echo 'Password is valid!';
} else {
echo 'Invalid password.';
}

这够强吗?我是否遗漏了一些大问题?

最佳答案

好的,让我们看看:

您正在生成一个介于当前时间戳 (≥ 1393631056) 和大约 7.59E+59 之间的数字:

$rand_number = rand($timestamp,$timestamp + pow(91239193912939123912,3));
$rand = pow($rand_number, 12);

这些值和计算似乎是任意的。坦率地说,如果随机值已经很大,pow($rand_number, 12) 很可能会返回 INF .

然后你放入随机数和固定种子,将其打乱,并使用它作为盐和 crypt 来散列密码:

$salt = str_shuffle($rand.$hash_seed);
$hash = crypt($password, $salt);

随机 float 加上固定盐产量仅在 16(在 INF 的情况下)和 20 个不同字符之间。但是,仔细查看 crypt 就会发现,如果您不指定算法,crypt 将使用 CRYPT_STD_DES:

Standard DES-based hash with a two character salt from the alphabet "./0-9A-Za-z". Using invalid characters in the salt will cause crypt() to fail.

现在这些句子中有两个方面应该引起你的怀疑:

  1. 基于标准 DES 仅使用两个字符作为盐,并且
  2. 这些字符必须来自 ./0-9A-Za-z,否则 crypt 失败。

因此,您的盐不仅包含 ./0-9A-Za-z 以外的字符,而且在最差的 16 个字符大字符集中,只有 16^2 = 256 种可能的盐.

那么,你应该怎么做呢? Just don’t try to reinvent the wheel but use existing and proven solutions.

关于php - 安全密码生成和存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22107431/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com