background image

PHP

安全 密码加 salt 原理分析

本文是对密码加 salt 原理进行了详细的分析介绍,供参考下
我们知道,如果直接对密码进行散列,那么黑客可以对通过获得这个密码散列值,然后
通过查散列值字典(例如 MD5 密码破解网站),得到某用户的密码。

加 Salt 可以一定程度上解决这一问题。所谓加 Salt

方法,就是加点 佐料 。其基本想法是

这样的:当用户首次提供密码时(通常是注册时),由系统自动往这个密码里撒一些 佐

料 ,然后再散列。而当用户登录时,系统为用户提供的代码撒上同样的 佐料 ,然后散
列,再比较散列值,已确定密码是否正确。

这里的 佐料 被称作 Salt

值 ,这个值是由系统随机生成的,并且只有系统知道。这样,

即便两个用户使用了同一个密码,由于系统为它们生成的 salt 值不同,他们的散列值也
是不同的。即便黑客可以通过自己的密码和自己生成的散列值来找具有特定密码的用户,
但这个几率太小了(密码和 salt 值都得和黑客使用的一样才行)。

下面以 PHP 示例,讲解 md5($pass.$salt)加密函数。
代码如下:

<?php
function hash($a) {
$salt=”Random_KUGBJVY”; //定义一个 salt 值,程序员规定下来的随机字符串
$b=$a.$salt; //把密码和 salt 连接
$b=md5($b); //执行 MD5 散列
return $b; //

 

返回散列

}
?>

调用方式:$new_password=hash($_POST[password]); //这里接受表单提交值,并
进行加密

下面详细介绍一下加 Salt 散列的过程。介绍之前先强调一点,前面说过,验证密码时要

使用和最初散列密码时使用 相同的 佐料。所以 Salt 值是要存放在数据库里的。

用户注册时,

用户输入【账号】和【密码】(以及其他用户信息);系统为用户生成【Salt 值】;系统将

【Salt 值】和【用户密码】连接到一起;对连接后的值进行散列,得到【Hash 值】;将

【Hash 值 1】和【Salt 值】分别放到数据库中。