Luk*_*ers 6 php ruby authentication encryption blowfish
有一个用PHP编写的应用程序,我将其转换为Ruby.加密密码时,PHP应用程序使用以下代码:
if($method == 2 && CRYPT_BLOWFISH) return crypt($pass, '$2a$07$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxx$');
Run Code Online (Sandbox Code Playgroud)
我假设这是使用Blowfish实现.这里的x都是a-zA-Z0-9字符.
Ruby中的Blowfish实现使用以下语法(取自http://crypt.rubyforge.org/blowfish.html):
blowfish = Crypt::Blowfish.new("A key up to 56 bytes long")
plainBlock = "ABCD1234"
encryptedBlock = blowfish.encrypt_block(plainBlock)
Run Code Online (Sandbox Code Playgroud)
我没有56或更少的字节长字符串,并且不清楚PHP版本应该是什么.那么如何编写一个Ruby函数来加密密码以获得与PHP相同的结果呢?
如果设置了 ( ),则PHP 代码将$pass使用盐进行哈希处理。salt 必须遵循 PHP 文档 ( ) 中指定的格式。$2a$07$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxx$CRYPT_BLOWFISHCRYPT_BLOWFISH == 1"$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 个第一个字符salt 因为除此之外 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"
Run Code Online (Sandbox Code Playgroud)
这将为您提供与 PHP 示例相同的输出。如果您的盐太长,请取前 29 个字符($2a$07$ 加上接下来的 22 个额外字符)。
我测试了 PHP 的行为,如果盐太长(总共超过 29 个字符),其余部分将被忽略,如果盐太短它将返回 0。例如在 PHP 中:
<?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
?>
Run Code Online (Sandbox Code Playgroud)