php中一些比常见做法更好的实践
有些被我们习以为常的做法未必就是最好的,它们可能存在一些安全问题,而解决这些隐患的成本,其实并不高;
密码
常见做法是直接MD5进行加密,比如这样:
//加密
$passwordStr = md5($password);
//校验
$passwordStr == md5($password);
简单明了,但这也是最容易被暴力破解的方式,所以更多人选择加一个盐值
$salt = 'abcd'
//加密
$passwordStr = md5($password.$salt);
//校验
$passwordStr == md5($password.$salt);
这样确实好了不少,只要盐值不泄露,就没那么容易被暴力攻破,如果盐值不是重复的就更好了……或者把md5
换成其他更安全的算法,或者使用 pbkdf2 之类的扩展算法增加一层保护……
然而做了这么多,还不如直接使用php自带的password_hash
和password_verify
函数:
//加密
$passwordStr = password_hash($password, PASSWORD_DEFAULT);
//校验
password_verify($password, $password_verify);
password_hash的官方文档
password_verify的官方文档
随机字符串
常见做法:
md5(microtime());
md5(rand());
//稍微好一点点的:
md5(mt_rand());
然而这些做法都不安全……更好的方案是:
$length = 16;
bin2hex(random_bytes($length));
这样就可以输出安全的32位16进制字符串了~
random_bytes的官方文档