php中一些比常见做法更好的实践

有些被我们习以为常的做法未必就是最好的,它们可能存在一些安全问题,而解决这些隐患的成本,其实并不高;

密码

常见做法是直接MD5进行加密,比如这样:

//加密
$passwordStr = md5($password);

//校验
$passwordStr == md5($password);

简单明了,但这也是最容易被暴力破解的方式,所以更多人选择加一个盐值

$salt = 'abcd'

//加密
$passwordStr = md5($password.$salt);

//校验
$passwordStr == md5($password.$salt);

这样确实好了不少,只要盐值不泄露,就没那么容易被暴力攻破,如果盐值不是重复的就更好了……或者把md5换成其他更安全的算法,或者使用 pbkdf2 之类的扩展算法增加一层保护……
然而做了这么多,还不如直接使用php自带的password_hashpassword_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的官方文档

posted @ 2017-04-21 18:01  不带汽的可乐  阅读(243)  评论(0编辑  收藏  举报