我想使用河豚哈希来哈希密码。
crypt()
在5.3之前的PHP版本中不支持
我的PHP版本是5.2.14。我如何使用河豚哈希?我可以用PEAR的Crypt_Blowfish
代替吗?
PEAR的Crypt_Blowfish意味着代表PHP的MCrypt扩展-它是一个双向加密方案,而不是用于散列。虽然比特币是基于河豚,但这不是一回事。令人困惑的是,PHP 5.3.0的CRYPT_BLOWFISH是一个哈希算法。
为什么升级到PHP 5.3.0+是不可能的?这不是你想自己实现的东西。如果可以的话,phpass是安全地进行基于加密的密码散列的好方法。如果你绝对不能升级,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。