在网络世界中,用户密码的安全问题日益受到关注,用户身份验证和密码保护变得愈发重要。
不用说明码保存密码这种低级问题,从2004年MD5碰撞漏洞以来在系统中使用md5保存密码都是不可以想象的灾难。
采用md5、sha1甚至是加盐的md5、sha256都已经是不安全的了
目前有四种仍然安全的密码哈希算法:
不用说明码保存密码这种低级问题,从2004年MD5碰撞漏洞以来在系统中使用md5保存密码都是不可以想象的灾难。
采用md5、sha1甚至是加盐的md5、sha256都已经是不安全的了
目前有四种仍然安全的密码哈希算法:
- Argon2
- bcrypt
- scrypt
- PBKDF2
一些PHP系统的生成环境可以没有安装PECL包,这种情况下 scrypt 哈希加密算法 就无法使用。
如果可能的话建议优先使用 scrypt 哈希加密算法。
除此之外我们建议优先使用 bcrypt,更重要的是PHP提供了内置函数支持。
我们可以直接使用 password_hash() 和 password_verify()
使用bcrypt需要注意它的两点限制:
对于一般网站来说这都不是问题,用户密码通常不会超过72个字符。
网页端输入也不可能会出现NUL(\0)字符。
如果可能的话建议优先使用 scrypt 哈希加密算法。
除此之外我们建议优先使用 bcrypt,更重要的是PHP提供了内置函数支持。
我们可以直接使用 password_hash() 和 password_verify()
使用bcrypt需要注意它的两点限制:
- 它最多只支持72个字符,超过的字符会被截断。
- 如果字符串中含有NUL(\0)字符时会被截断
对于一般网站来说这都不是问题,用户密码通常不会超过72个字符。
网页端输入也不可能会出现NUL(\0)字符。
实际实现代码
用户密码的加密:
CodeIgniter4本身有提供加密库,我这里直接使用了CodeIgniter4自带的加密库。
也可以使用专业的 php-encryption 加密库。
在用户登录时验证密码是否正确,这里进行函数封装:
CodeIgniter4本身有提供加密库,我这里直接使用了CodeIgniter4自带的加密库。
也可以使用专业的 php-encryption 加密库。
[复制到剪贴板] |
/**
* Hash密码,并加密Hash值。返回加密后的结果。
* 返回值可以直接保存到数据库中。
* @param $password 用户输入的密码
* @return 返回加密后的Hash值
*/
function password_hashAndEncrypt(string $password): string {
$hash = password_hash($password, PASSWORD_DEFAULT);
if (!is_string($hash))
return false;
$encrypter = \Config\Services::encrypter();
return base64_encode($encrypter->encrypt($hash));
//php-encryption
//return Crypto::encrypt($hash, $aesKey);
}
在用户登录时验证密码是否正确,这里进行函数封装:
[复制到剪贴板] |
/**
* 解密数据库中的Hash值并验证密码是否正确
* @param $password 用户输入的密码
* @param $ciphertext 数据库保存的加密hash值
* @return 返回验证是否成功
*/
function password_decryptAndVerify(string $password, string $ciphertext): bool{
$encrypter = \Config\Services::encrypter();
$hash = $encrypter->decrypt(base64_decode($ciphertext));
//php-encryption
//$hash = Crypto::decrypt($ciphertext, $aesKey);
if (!is_string($hash))
return false;
return password_verify($password, $hash);
}
加密算法库下载
专业加密算法库 php-encryption-2.4.0.zip