1

我想使用Blowfish 散列来散列密码。

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

我的 PHP 版本是 5.2.14。如何使用 Blowfish 哈希?我可以用 PEARCrypt_Blowfish代替吗?

4

2 回答 2

5

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'; 
于 2011-07-28T18:25:36.480 回答
3

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

虽然包没有“手写”文档,但有从包本身的注释派生的自动生成的 API 文档。

这就是我使用它来加密的方式:

$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。

于 2011-07-31T08:43:30.467 回答