如果设置了CRYPT_BLOWFISH
(CRYPT_BLOWFISH == 1
),则PHP代码将散列$pass
与盐$2a$07$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxx$
进行散列。盐必须遵循PHP文档("$2a$", a two digit cost parameter, "$", and 22 digits from the alphabet "./0-9A-Za-z"
)中指定的格式。
我不确定您是否可以使用您所指的库,但可以使用bcrypt-ruby
代替。
为您的代码会是这样的,我用从PHP示例(http://php.net/manual/en/function.crypt.php)相同的数据,我只取盐的29个字符,因为超出了PHP忽略它:
require 'bcrypt-ruby'
pass = "rasmuslerdorf" # Here you should put the $pass from your PHP code
salt = '$2a$07$usesomesillystringfors' # Notice no $ at the end. Here goes your salt
hashed_password = BCrypt::Engine.hash_secret(pass,salt) # => "$2a$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi"
这给出了与PHP示例相同的输出。如果您的盐太长,请先拿出29个字符($ 2a $ 07 $加上接下来的22个额外字符)。
我测试PHP的行为,如果盐过长(超过总29个字符),余下部分被忽略,如果实在嫌盐总之它会在PHP返回0。例如:
<?php
crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$')
// returns $2a$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi
crypt('rasmuslerdorf', '$2a$07$usesomesillystringfors')
// returns $2a$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi
crypt('rasmuslerdorf', '$2a$07$usesomesilly')
// returns 0 because the salt is not long enough
?>
这工作完美。谢谢! – 2012-01-29 16:42:52