从零开始写一个 PHP 站 (3) —— 密码的加密处理

0

Loading

5.密码加密处理

事实上,在前面的代码中,很容易就会发现一个大问题:密码是以明文保存的。显然这是一种极其不安全,也是极其不负责任的一种做法。所以我们需要在之前的代码中做出一定的修改,让密码不再以明文形式储存。如此一来,用户的密码明文将只有用户知道,这也是符合规范的。

(1)认识 PHP crypt() 函数

学习一个 PHP 函数最好的方法可能就是先看一看 W3School 了。虽然可能有些晦涩难懂,上面的表达也不是非常清晰,不过对于一个函数的工作方式的了解,还是很有用处的。

点击跳转到 W3School 页面

注意:不要使用标准 DES 加密算法,因其最大加密长度为 8 位,超过 8 位的密码加密结果将完全相同!同时切勿将加密循环次数设置过大,否则会使 PHP 线程过长时间运行,网页无法正常加载。

crypt() 函数的用法相当简单,重点讲一下盐值的问题。

指定不同加密算法的方式是设置相应的盐值前缀。每种加密算法对盐值的要求都不同,请根据具体加密算法要求设置符合要求的盐值( W3School 中非常详细)。盐值可以用变量拼凑,也可指定为固定字符串,但必须确保盐值始终已知,以免后期无法进行密码比对。

PHP 拼凑变量的方法比较简单,将不同变量用“.”分隔即可,就像下面这样:
$salt = "$name.$password";

假设 name 变量的值为 1 , password 变量的值为 2 ,那么 salt 变量在拼凑之后的值就是 12 .

(2)应用加密

应用加密说白了就是把原本保存明文密码的地方设置上加密函数而已。以下代码建立在已经设置好 salt 变量的基础上。盐值是作为 crypt() 函数的一个参数存在的,加进去就好。
$password=crypt(trim($_POST["password"]).$name, $salt);

这里面其实包含了一个小技巧:加密的字符串不是单纯的密码,而是密码和用户名拼凑出的新字符串。这样的好处是,即使加密后的字符串遭到破解,解密结果也不是密码。
其实在盐值里面混入用户名,使每个用户都有独立的盐值,会大大增加安全性——就算被拖库,也还需要挨个破解密码。
至于用密码做盐值加密密码的问题,我不是密码学的,所以并不知道会更安全还是更危险……
密码加密就到这儿了,下次写啥忘记了(等我回去看看便笺)