早在2010年,美国软件工程学会(SEI)就认为MD5算法已被破解,再也不适用。
"cryptographically broken and unsuitable for further use"
考虑到国内依旧在普遍使用MD5算法于安全领域,写此为,但愿引发你们对安全的重视。php
MD5函数过去一般用于数据的完整性校验和用户密码的加密保存。算法
常见的应用是数据库
<?php //md5 碰撞示范,数据不一样,md5值同样 $a = <<< EOT d131dd02c5e6eec4693d9a0698aff95c 2fcab58712467eab4004583eb8fb7f89 55ad340609f4b30283e488832571415a 085125e8f7cdc99fd91dbdf280373c5b d8823e3156348f5bae6dacd436c919c6 dd53e2b487da03fd02396306d248cda0 e99f33420f577ee8ce54b67080a80d1e c69821bcb6a8839396f9652b6ff72a70 EOT; $b = <<< EOT d131dd02c5e6eec4693d9a0698aff95c 2fcab50712467eab4004583eb8fb7f89 55ad340609f4b30283e4888325f1415a 085125e8f7cdc99fd91dbd7280373c5b d8823e3156348f5bae6dacd436c919c6 dd53e23487da03fd02396306d248cda0 e99f33420f577ee8ce54b67080280d1e c69821bcb6a8839396f965ab6ff72a70 EOT; $a = str_replace("\n","",$a); $a = hex2bin($a); $b = str_replace("\n","",$b); $b = hex2bin($b); assert($a !=$b); echo md5($a); echo "\n"; echo md5($b); echo "\n";
用户的登陆密码,是很重要的一个安全环节。
若是明文保存在数据库,一旦黑客入侵或是内部员工盗窃,用户密码就会泄漏。
国内外大网站都发生过因黑客或是内部员工致使用户数据的泄漏问题,用户密码一旦泄漏对于电商网站或是支付网站的影响是难于估量的。安全
为了保护用户密码,早期人们使用MD5算法把密码加密后保存,一般计算MD5值时会加一个”盐值“(即一个固定的密串),这个盐值多是共用的,也多是一个用户一个盐值。网络
MD5(密码+盐值),这样形式的密码储存方案在早期基本上是密码存储的一个通行标准,国内多数网站(包括大型电商和支付网站)早期都采用的是这个办法,若是没有更新的话,如今不少网站依旧是这个方案。函数
这样的方案什么不对?
1. 对于黑客入侵或是内部员工,能拿到用户数据的人,很容易就拿到盐值
2. 虽然黑客不能反解密码,密码一般有必定的规则,诸如大小写数字六位数以上等,黑客可经过排列组合一个一个的试,暴力破解,由于MD5值的计算速度很快,对于六位数密码,很容易攻克。
注意:这个暴力破解是离线运行的,在线的暴力破解很容易阻挡。
被攻击的网站没有感受,若是用比特币挖矿的矿机,这样的破解垂手可得,没挑战。性能
你会说,MD5不行,SHA1也被谷歌破解了,SHA256 密码加盐值这样可靠了吧?
SHA256 密码加盐值也不安全。
由于,MD5,SHA1,SHA256就不是用来保存密码用的, 是用来校验数据完整性用的,三个算法的计算速度都很快,试想一下,校验一个4G的ISO镜像文件,必需要有高效的计算速度。网站
由于算法效率高,速度快,也就下降了暴力破解的难度。ui
正确的作法是使用bcrypt算法,bcrypt算法的优势是计算速度慢,没错计算速度慢,
还能够经过参数调节速度,要多慢有多慢。加密
<?php $options = ["cost" => 10 ]; //调速参数,越大越慢 $password = "password here"; $hash = password_hash($password, PASSWORD_BCRYPT, $options); echo "$hash\n"; // 校验 assert(password_verify($password,$hash) == true);
普通的电脑每秒可运行数万次SHA256计算,bcypt算法经过参数设置能够调整为计算一次耗时1秒。
这样大幅提升了暴力破解的门槛,加强了安全性。
这里有个比特币矿机配置,供参考, 以便提升安全意识:
型号:HashFast Sierra Batch 2
价格:7080美圆
功率: 780瓦
性能: 1200 GH/s (每秒可运行1.2万亿次SHA256计算)