我想使用Blowfish 散列来散列密码。
crypt()
在 5.3 之前的 PHP 版本中不支持它
我的 PHP 版本是 5.2.14。如何使用 Blowfish 哈希?我可以用 PEARCrypt_Blowfish
代替吗?
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';
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。