PHP-код хэширует $pass
с солью $2a$07$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxx$
, если установлено CRYPT_BLOWFISH
(CRYPT_BLOWFISH == 1
).Соль должна соответствовать формату, указанному в документации 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 символов)остальное игнорируется, если соль слишком короткая, она вернет 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
?>