这本文主要介绍公认较为安全的PHP密码加密方式,推荐使用PHP官方内置的密码哈希函数password_hash()
,介绍低版本适配与其他解决方案。
由于计算机运算速度的提升,密码破解的速度也在提升,网络中有大量的MD5解密库和提供解密的网站。MD5作为密码加密已经不再安全。
PHP >= 5.5 使用 password_hash()
PHP官方在5.5版本以上内置了密码散列算法的拓展函数,通过一系列函数可以非常方便的创建、校验一个密码的哈希值(Hash)。
创建哈希password_hash():官方手册 PHP: password_hash – Manual
校验哈希password_verify():官方手册 PHP: password_verify – Manual
简单实例:
$password = 'aspirantzhang'; var_dump(password_hash($password, PASSWORD_DEFAULT)); //输出:string(60) "$2y$10$lgbL3K4uh1rbIxu4KrYjteZBLHUfL.wQDp/R1FrAGt.FVCvAB5NAu"
注意,函数中第二个参数目前是必填的。PASSWORD_DEFAULT表示算法会随着PHP的升级而加强,最低长度60个字符,为了适应日后的高强度算法,建议255个字符。所以在数据库表结构的规划中,密码字段类型或许就应该是varchar(255)。
另外password_hash()每次计算出的哈希值都是不一样的,不像MD5是固定的。但是这个哈希值是可以存入数据库的,通过另一个校验函数,可以校验出密码的正确与否:
$password_hash = '$2y$10$lgbL3K4uh1rbIxu4KrYjteZBLHUfL.wQDp/R1FrAGt.FVCvAB5NAu'; var_dump(password_verify('aspirantzhang', $password_hash)); //输出:bool(true)
5.3.7 <= PHP < 5.5 使用 password_compat
都什么年代了你还在用php5.3。来自美国的工程师Anthony Ferrara提供了一个兼容程序,名为 password_compat ,可以实现在PHP5.3.7及以上版本中实现password_*类函数。
password_compat项目地址:https://github.com/ircmaxell/password_compat
使用时最好先运行一下version-test.php,测试一下是否能够正常使用。如果出现Pass!你就幸运了。
3 <= PHP < 5.5 使用 phpass
你的程序肯定是老古董。建议使用著名的php密码哈希框架phpass,要知道大名鼎鼎的WordPress、bbPress曾经都是用的它。
PHPASS项目地址:http://www.openwall.com/phpass/
其他
关于密码安全加密的问题,可参考 https://stackoverflow.com/questions/401656/secure-hash-and-salt-for-php-passwords/