下面说说安全保护密码的标准算法,就是bcrypt算法。为了说清楚,在两篇文章中描述:讲bcrypt算法,进一步解释PHPcrypt()算法的参数。虽然不再推荐crypt()算法,但是对于理解bcrypt算法还是很有帮助的。你可以看看它的历史。在一个系统中,如果有多种开发语言,bcrypt算法是否通用?由PHP和Ptyhon语言描述。本文主要了解bcrypt算法。bcrypt算法可以认为是KDF函数的一种实现,它也有迭代因子的概念。bcrypt算法基于Blowfish块密钥算法。bcrypt算法已有10多年历史,Blowfish密钥算法已有20多年历史。它经过反复试验,因此被认为是Hash加密密码的标准算法。bcrypt算法在内部使用内存来初始化哈希过程。由于需要内存,虽然在CPU上运行速度很快,但并行在GPU上运行速度并不快,这也减慢了攻击者的破解速度。下面我将使用PHP语言中的crypt()函数来介绍如何使用bcrypt算法。如果你对Hash保护密码不是很了解,使用crypt()函数可能会遇到很多问题。首先要明确的是,crypt()函数并不是bcrypt算法,它可以基于很多不同的Hash算法。这个函数的原型:stringcrypt(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";}表示使用bcrypt算法(注意:如果是PHP5.3.7以后的版本,使用它,修复安全风险)。07表示7次迭代。最后一个$后面的内容就是盐值。接下来看上面代码的输出:Blowfish:$2a$07$woshiyyigesaltzhi$$$$$.lrU488y7E1Xw.JA4uizIu.PBSSe7t4y也就是说返回值中包含crypt()函数的信息,比如告诉你使用bcrypt算法,迭代因子为7,salt为woshiyigesaltzhi$$$$$,其余为密码密文。这里还有一个问题,crypt()算出的密码密文含salt是不是不安全?这将在下一篇文章中介绍。crypt()还可以使用其他的Hash函数,比如:CRYPT_MD5:CRYPT_BLOWFISH:orCRYPT_SHA256:CRYPT_SHA512:crpyt()函数的使用你大概明白了,使用起来可能有点麻烦,所以建议打包这个函数:functionbetter_crypt($input,$rounds=7){$salt=openssl_random_pseudo_bytes(22);returncrypt($input,sprintf('$2a$%02d$',$rounds).$salt);}无论如何,crypt()函数完全基于底层C函数,运行环境也取决于操作系统和PHP版本。系统和代码迁移时可能会出现各种问题,所以PHP从5.5版本开始推荐使用PasswordHashingFunctions,下篇文章会详细说明。最后简单提一下scrypt算法,它是一种新的密码保护算法,也是另一种思路。它被认为是密码保护的行业标准算法。不过由于时间较短,建议现在使用bcrypt()算法。
