PHP Bcrypt哈希

时间:2011-07-28 17:52:08

标签: php hash pear blowfish crypt

我想使用 Blowfish哈希来哈希密码。

crypt()在5.3之前的PHP版本中不支持它

我的PHP版本是5.2.14。我怎样才能使用Blowfish哈希?我可以使用PEAR Crypt_Blowfish吗?

2 个答案:

答案 0 :(得分:6)

PEAR的Crypt_Blowfish旨在代表PHP的MCrypt扩展 - 它是双向加密方案,不适用于散列。虽然bcrypt基于Blowfish,但它不是一回事。令人困惑的是,PHP 5.3.0的CRYPT_BLOWFISH是一种散列算法。

有没有理由不能升级到PHP 5.3.0+?这不是您想要尝试自己实现的。如果可以,phpass是一种安全地进行基于bcrypt的密码散列的好方法。如果你绝对无法升级,phpass会回归到较旧的哈希方案(但它仍然比普通的MD5更安全等)。

如果出于某种原因你可以安装Suhosin但不升级PHP,那就会增加CRYPT_BLOWFISH支持。

要确保您当前没有安装CRYPT_BLOWFISH,请尝试以下操作:

 echo (CRYPT_BLOWFISH === 1) ? 'CRYPT_BLOWFISH is enabled!' : 'CRYPT_BLOWFISH is not available'; 

答案 1 :(得分:3)

PEAR的Crypt_Blowfish软件包提供使用mcrypt扩展的blowfish加密(如果可用),如果没有,它会在php中本地实现blowfish算法。它不会回退到使用任何其他形式的加密。

虽然没有针对该软件包的“手写”文档,但是从软件包本身的注释中得到auto-generated API documentation

这是我用它加密的方式:

$bf = Crypt_Blowfish::factory('ecb', null, null, CRYPT_BLOWFISH_PHP);
$iv = 'abc123+=';                                                      
$key = BLOWFISH_KEY;                                                   
$bf->setKey($key, $iv);                                                
$encrypted = bin2hex($bf->encrypt($password));        

并解密:

$bf = Crypt_Blowfish::factory('ecb', null, null, CRYPT_BLOWFISH_PHP);       
$iv = 'abc123+=';                                                              
$key = BLOWFISH_KEY;                                                           
$bf->setKey($key, $iv);                                                        
$decrypted = trim($bf->decrypt(hex2bin($password))); 

其中BLOWFISH_KEY是我在代码中其他地方定义的常量。

在这些示例中,我明确使用了PHP实现。

如果我想让Crypt_Blowfish决定使用哪个引擎,即确定它是否可以使用mcrypt扩展(如果可用)(否则使用php实现),然后我将使用CRYPT_BLOWFISH_AUTO进行切换。要显式使用mcrypt扩展名,请指定CRYPT_BLOWFISH_MCRYPT。