密码散列安全

为什么要将用户密码序列化

当设计一个需要用户设置密码的应用时,对密码进行散列是最基本的,也是必须考虑的安全考虑。如果不对用户密码进行散列处理,一旦用户数据库受到攻击时,用户密码将被窃取。同时,窃取者再去尝试其他应用,如果用户没有为每个应用单独设置密码,那么将面临风险。

通过对密码进行散列,然后再保存到数据库中,这样就使得攻击者无法直接获取原始密码,同时还可以保证你的应用可以对原始密码进行相同的散列处理,然后比对散列结果。

为何md5和sha1这些常见的函数不适合用在密码保护场景

MD5,SHA1 以及 SHA256 这样的散列算法是面向快速、高效 进行散列处理而设计的。随着技术进步和计算机硬件的提升, 破解者可以使用“暴力”方式来寻找散列码 所对应的原始数据。

因为现代化计算机可以快速的“反转”上述散列算法的散列值, 所以很多安全专家都强烈建议 不要在密码散列中使用这些散列算法。

建议使用password_hash

函数列表:

  1. password_hash()
  2. password_verify()
  3. password_needs_rehash()
  4. password_verify()
1
2
3
4
5
6
7
8
9
10
11
12
$str = password_hash('123456'); //生成散列值
password_verify('123456',$str); //颜值散列值
password_get_info($str); //返回指定散列(hash)的相关信息,返回如下:
//默认:
array (size=3)
'algo' => int 1
'algoName' => string 'bcrypt' (length=6)
'options' =>
array (size=1)
'cost' => int 10
//检测生成密码的选项是否改变
password_needs_rehash($str, PASSWORD_DEFAULT, ['cost' => 13]); //返回true