php安全的密码存储方式,php – 安全密码生成和存储

我正在构建一个登录系统,我想确保我正在编写写代码以在db中生成和存储密码. $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.';

}

这够强吗?我错过了一些大问题吗?

解决方法:

更长的盐并不意味着更好的保护.您没有正确使用crypt功能. $salt参数不应该是一个简单的随机字符串.

考虑这个例子:

echo crypt('password one', 'salt lorem ipsum dolor sit amet');

echo crypt('password two', 'salt');

两者都会返回相同的字符串! (sa3tHJ3 / KuYvI)

检查http://php.net/crypt以获取有关如何正确使用$salt的更多信息.

保持一个唯一的hash_seed代码端然后在数据库中只存储一个组合密码和hash_seed的字符串的sha哈希(或其他算法)也好得多(更安全?).

正确的实施将是:

define('SECRET_KEY', 'm9238asdasdasdad31d2131231231230132k32ka¡2da12sm2382329'); // longer is better

public function createPasswd($options) {

return hash('sha256', SECRET_KEY . $options['passwd']);

}

要检查密码:

if ($stored_hash == hash('sha256', SECRET_KEY . $password) {

echo 'Password is valid!';

} else {

echo 'Invalid password.';

}

sha256可以替换为您系统上的任何可用算法.获取完整列表:

var_dump(hash_algos());

标签:php,passwords,hash

来源: https://codeday.me/bug/20191007/1865022.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值