PHP 如何做密码加密

很多人在做网站注册时,都会碰到“密码加密”的需求——总不能把用户的真实密码直接存在数据库里,万一数据泄露,所有人的账号都有风险。这时候PHP的加密方法就派上用场了,而且操作起来比你想的简单,只要用对工具,就能给密码穿上“防弹衣”。

别用老方法:明文和MD5真的不安全

先说说大家可能踩过的坑。早年很多人直接把密码存成明文,或者用MD5加密。比如用户设密码是“123456”,MD5加密后变成“e10adc3949ba59abbe56e057f20f883e”,但这种加密是“单向可查”的——黑客只要拿彩虹表(预存的常见密码的MD5值)一对比,就能猜出原密码。就像你把家门钥匙直接贴在门外面,小偷找个对应钥匙就能打开,所以这两种方法现在完全不能用了。

PHP 如何做密码加密

正确姿势:用PHP自带的密码哈希函数

现在PHP专门给密码加密做了两个自带函数,不用自己写复杂逻辑,安全又简单,分别是password_hash()和password_verify(),就像给密码装了“动态锁”,每次加密的结果都不一样,就算密码相同,每次生成的密文也不同。

先看加密密码的例子:假设用户注册时输入的密码是“user123”,你只需要一行代码就能加密并存到数据库里:

`php

$userPwd = "user123";

$encryptedPwd = password_hash($userPwd, PASSWORD_DEFAULT);

`

这里的PASSWORD_DEFAULT是PHP推荐的算法,现在是BCRYPT,以后如果有更安全的算法,它会自动更新,不用你手动改代码,省心又安全。加密后的结果大概是这样的:$2y$10$...,不仅包含了加密后的密码,还自带了“盐值”(就是让密码更难破解的随机串),完全不用担心盐值丢失的问题。

验证密码:用同一个函数核对

用户登录时,需要把他输入的密码和数据库里存的加密密码做对比,这时候要用password_verify(),别自己去对比字符串——因为每次加密的结果不一样,直接比对的话肯定失败。举个例子:

`php

// 从数据库取出的加密密码

$dbEncryptedPwd = "$2y$10$G8z7f9xR...";

// 用户登录时输入的密码

$inputPwd = "user123";

if (password_verify($inputPwd, $dbEncryptedPwd)) {

echo "登录成功";

} else {

echo "密码错误";

}

`

这个函数会自动把输入的密码用数据库里存的盐值重新加密一次,再和原密文对比,就像用同一把钥匙插两次动态锁,只有对的钥匙才能打开,正确率100%。

小细节:要不要手动加“盐值”?

很多人会纠结要不要自己加盐,其实不用——password_hash()已经自动加了唯一的随机盐,比你手动加的盐安全多了。比如手动加盐容易出现“盐值重复”的问题,而这个函数每次生成的盐都是随机的,就算两个用户用同一个密码,加密后的密文也不一样,完全不用担心批量破解。

最后提醒一句,别去网上找什么“自定义加密算法”,PHP自带的函数已经经过无数安全专家检验,是目前最稳妥的方法,不用自己造轮子,用现成的工具就行,才能真正保护好用户的密码。

上一篇 Swift编程语言:从基础语法到实际应用的核心特性科普