谈一谈安全保护口令的的标准算法,这就是 bcrypt 算法。为了把事情说清楚,分两篇文章描述:
本文主要理解 bcrypt 算法,bcrypt 算法可以认为是 KDF 函数的一种实现,也有迭代因子的概念。
bcrypt 算法基于 Blowfish 块密钥算法,bcrypt 算法已经有10多年的历史,而 Blowfish 密钥算法更是有20多年的历史,久经考验,所以被认为是 Hash 加密口令的标准算法。
bcrypt 算法在内部会使用内存初始化 hash 过程,由于需要内存,虽然在 CPU 上运行很快,但在 GPU 并行运算却不快,这也减缓了攻击者的破解速度。
接下去我使用 PHP 语言中的 crypt() 函数介绍如何使用 bcrypt 算法,如果你对 Hash 保护口令了解的不多,那么使用 crypt() 函数可能会存在很多问题。
首先必须明确 crypt() 函数并不是 bcrypt 算法,它可以基于多种不同的 Hash 算法。
该函数的原型:
- string crypt ( string $str [, string $salt ] )
看上去很简单,但隐藏了很多内容。
如果你仅仅调用 crypt(),会根据操作系统版本和 PHP 版本使用相应的 Hash 算法,而且如果不显示的输入 salt,可能会得到一个弱 salt,所以不推荐这样调用 crypt() 函数,因为屏蔽了很多细节。
那么如何选定 bcrypt 算法(Blowfish)、迭代因子、salt,先看一个例子:
- if (CRYPT_BLOWFISH == 1) {
- echo 'Blowfish:' . crypt('abcde', '$2a$07$woshiyigesaltzhi') . "\n";
- }
接下去看看上面代码的输出:
- Blowfish:$2a$07$woshiyigesaltzhi$$$$$.lrU488y7E1Xw.JA4uizIu.PBSSe7t4y
也就是说返回值包含了 crypt() 函数相关信息,比如告诉你使用了 bcrypt 算法,迭代因子是 7,salt 是 woshiyigesaltzhi$$$$$,剩下的部分就是口令密文。
此处,遗留一个问题,crypt() 运算出来的口令密文包含 salt 是否不安全?这会在下一篇中描述。
crypt() 也可以使用其它的 Hash 函数,比如:
大家大概明白 crpyt() 函数的使用了,可能使用的时候有点麻烦,所以建议包装下该函数:
- function better_crypt($input, $rounds = 7) {
- $salt = openssl_random_pseudo_bytes(22);
- return crypt($input, sprintf('$2a$%02d$', $rounds) . $salt);
- }
不管怎么说,crypt() 函数完全基于底层的 C 函数,运行环境也依赖于操作系统和PHP版本,系统和代码迁移的时候可能有多种问题,所以 PHP 从 5.5 版本以后建议使用Password Hashing Functions,这在下一篇会详细说一下。
最后简单提下 scrypt 算法,它是一种新的口令保护算法,是另外一种思路,被认为是口令保护的业界标准算法,但由于时间较短,现在建议还是使用 bcrypt() 算法。
在没有SpringBoot内嵌有Tomcat之前,我们都是将项目打为War包放在Tomcat的webapp...
被业界誉为CAE领域的奥斯卡盛会第十五届中国CAE工程分析技术年会,于8月17-18 在...
也许许多工作员会觉得新建站时只必须网站空间或是VPS就就行了,但在事实上并非那...
戴尔的支持服务于2008年首次推出ProSupport服务,市场的反应使其成为一项备受好...
对于很多客户来说,都会误以为高防服务器安全性足够高,不需要进行过多的安全手...
各公司都希望在适应新的工作、员工管理和客户服务方式的同时,尽可能地抓住所有...
1.曾经爱过你的人,前世一定和你有缘,不要语言虐待。如果他今生真的负你了,那...
智能化大潮风起云涌,行业的智能化转型升级正在成为中国经济新旧动能转换的核心...
缓存误用 缓存,是互联网分层架构中,非常重要的一个部分,通常用它来降低数据库...
如今,越来越多的企业在业务场景是使用 Elasticsearch(下文统一称为 ES) 存储自...