2011-07-28 31 views
1

我想用河豚散列哈希密码。PHP Bcrypt散列

crypt()不前5.3

我的PHP版本支持在PHP版本5.2.14是。我如何使用Blowfish哈希?我可以用PEAR的Crypt_Blowfish代替吗?

+2

河豚不是加密而不是哈希? – Manhim

+0

他的意思是bcrypt,它是使用一些Blowfish部件的密码派生方案。的 –

+0

可能重复[你如何使用bcrypt在PHP哈希密码?](http://stackoverflow.com/questions/4795385/how-do-you-use-bcrypt-for-hashing-passwords-in-php) – derobert

回答

6

PEAR的Crypt_Blowfish是为了支持PHP的MCrypt扩展 - 这是一个双向加密方案,而不是散列。虽然bcrypt基于Blowfish,但这不是一回事。令人困惑的是,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'; 
+2

澄清... php ['crypt()'](http://www.php.net/manual/en/function.crypt.php)函数,它可以设置为使用['CRYPT_BLOWFISH' ](http://www.php.net/manual/en/function.crypt.php)方法(如链接页面上定义的)是一个哈希函数,哈希函数有4到31次迭代。这不是一个双向加密功能。 – eykanal

+0

有没有关于如何使用Suhosin进行散列的教程? – chnet

+0

@chnet Suhosin是一个PHP补丁 - 它只是帮助保护PHP。其中一件事是用PHP的'crypt()'函数添加对CRYPT_BLOWFISH的支持。这不是用来编写应用程序的东西。如果你在共享主机上,你可能无法安装它。 –

3

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

没有为包没有“手写”的文件虽然没有从封装本身的注释衍生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。