PHP 安全之道: 密码安全
??? 最近几年用户数据泄露越发频繁, 一些使用 PHP 技术的大型网站被暴库或者脱库, Facebook 公司曾因为此类事件股价暴跌. 从长远发展来看, 用户的数据安全对于网站来说至关重要, 所以开发者需要关注数据相关的安全, 并提高一些对敏感数据的技术性保护.
??? 用户数据的安全往往和用户密码安全息息相关. 用户将账号和相关数据存储在服务器上, 而密码成了第一个环节.
1. 常规加密方法
MD5 或者 SHA1
具体代码如下所示:
- <?PHP
- $password = $_POST['password'];
- echo md5($password); // md5 加密
- echo sha1($password); // sha1 加密
??? 由于这种加密手段比较常规, 如果用户设置的密码过于常见简单, 攻击者完全可以使用密码字典进行暴力破解. 所以不建议使用 MD5 等弱加密算法对密码等敏感数据进行加密, 使用散列算法进行加密更佳, 如: SHA256 或者 SHA512. 这些算法被用于如 ssl 证书生成或一些重要的生成算法中, 值得使用.
PHP 内置了 hash()函数, 具体使用如下代码所示.
- <?PHP
- $password = $_POST['password'];
- echo hash('sha256', $password); // 使用 sha256 加密
- echo hash('sha512', $password); // 使用 sha512 加密
曾经有一个神奇的电商网站有一句有名的 slogan:"我为自己代言." 在密码安全方面我们也可以为自己的数据加点 "盐", 增加安全系数.
使用盐 (salt) 甚至随机 salt 来加密, 可以让破解更加困难. 简单例子如下:
- <?PHP
- $password = $_POST['password'];
- $salt = rand(1, 100000);
- $password = sha1($password . $salt);
而更为复杂的加密, 可以使用 mcrypt 函数来生成 salt, 代码如下:
- <?PHP
- $password = $_POST['password'];
- $salt = base64_encode(mcrpyt_create_iv(32, MCRYPT_DEV_RANDOM);
- $password = md5($password . $salt);
当然还可以根据自己实际业务需要自定义自己的算法, 以前和腾讯的研发联调接口的时候, 我们还会约定不同的业务接口使用不同的业务代码来增加 token 算法的复杂度.
为了防止暴力破解, 可以注意以下方面:
1. 使用验证码进行登录验证或相关授权.
2. 定期刷新秘钥.
3. 使用随机数的复杂算法.
4. 限制某时间段内验证次数.
来源: http://www.bubuko.com/infodetail-3367430.html