我想使用 Blowfish哈希来哈希密码。
crypt()
在5.3之前的PHP版本中不支持它
我的PHP版本是5.2.14。我怎样才能使用Blowfish哈希?我可以使用PEAR Crypt_Blowfish
吗?
答案 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。