2011-12-16 19 views
6

Hay una aplicación escrita en PHP que estoy convirtiendo a Ruby. Al cifrar contraseñas de la aplicación PHP utilizando el siguiente código:Contraseña de autenticación encriptada en PHP usando Blowfish con Ruby

if($method == 2 && CRYPT_BLOWFISH) return crypt($pass, '$2a$07$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxx$'); 

Asumo esto es usar una aplicación Blowfish. Las x aquí son todos los caracteres a-zA-Z0-9.

La aplicación Blowfish en Ruby utiliza la siguiente sintaxis (tomado de http://crypt.rubyforge.org/blowfish.html):

blowfish = Crypt::Blowfish.new("A key up to 56 bytes long") 
plainBlock = "ABCD1234" 
encryptedBlock = blowfish.encrypt_block(plainBlock) 

que no tienen una cadena larga de 56 o menos bytes y no está claro lo que debe ser de la versión de PHP . Entonces, ¿cómo puedo escribir una función de Ruby que encriptará las contraseñas para dar el mismo resultado que la de PHP?

Respuesta

4

El código PHP es hashing $pass con la sal $2a$07$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxx$ si CRYPT_BLOWFISH está configurado (CRYPT_BLOWFISH == 1). La sal debe seguir el formato indicado en la documentación de PHP ("$2a$", a two digit cost parameter, "$", and 22 digits from the alphabet "./0-9A-Za-z").

No estoy seguro si puede hacerlo con la biblioteca a la que hace referencia, pero puede usar bcrypt-ruby en su lugar.

Para su código sería algo como esto, estoy usando los mismos datos del ejemplo PHP (http://php.net/manual/en/function.crypt.php), sólo tomo los 29 primeros caracteres de la sal porque más allá de que PHP lo ignora:

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" 

Esto le da el mismo resultado que en el ejemplo de PHP. Si su sal es demasiado larga, tome los primeros 29 caracteres ($ 2a $ 07 $ más los siguientes 22 caracteres adicionales).

He probado el comportamiento de PHP, si la sal es demasiado largo (más allá de 29 caracteres en total) el resto se ignora, si la sal es demasiado corto devolverá 0. Por ejemplo, en 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 
?> 
+0

Esto funciona perfectamente ¡Gracias! –

Cuestiones relacionadas