2011-12-16 13 views
6

Istnieje aplikacja napisana w PHP, którą konwertuję na Ruby. Podczas szyfrowania haseł aplikacji PHP wykorzystuje następujący kod:Uwierzytelnianie hasła zaszyfrowanego w PHP za pomocą Blowfish z Ruby

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

Jestem zakładając ten stosuje Blowfish realizację. Litery X to wszystkie znaki a-zA-Z0-9.

Blowfish realizacja w Ruby ma następującą składnię (wzięte z http://crypt.rubyforge.org/blowfish.html):

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

ja nie mam 56 lub mniej bajtów długi łańcuch i nie jest jasne, co to powinno być od wersji PHP . Jak więc napisać funkcję Ruby, która będzie szyfrować hasła, aby dać taki sam wynik jak PHP?

Odpowiedz

4

szyfrowego PHP mieszania $pass solą $2a$07$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxx$ jeśli CRYPT_BLOWFISH jest ustawiony (CRYPT_BLOWFISH == 1). Sól musi być zgodna z formatem wskazanym w dokumentacji PHP ("$2a$", a two digit cost parameter, "$", and 22 digits from the alphabet "./0-9A-Za-z").

Nie jestem pewien, czy możesz to zrobić z biblioteką, do której się odwołujesz, ale możesz zamiast tego użyć bcrypt-ruby.

Dla kodu byłoby coś takiego, używam tych samych danych z PHP (np http://php.net/manual/en/function.crypt.php), ja tylko wziąć 29 pierwszych znaków soli, ponieważ poza tym PHP ignoruje go:

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" 

To daje takie same wyniki jak na przykładzie PHP. Jeśli twoja sól jest zbyt długa, weź pierwsze 29 znaków (2a $ 7 $ plus kolejne 22 dodatkowe znaki).

testowałem zachowanie PHP, jeśli sól jest zbyt długi (ponad 29 znaków w sumie), reszta jest ignorowana, jeśli sól jest zbyt krótki powróci 0. Np w 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

To działa idealnie. Dzięki! –

Powiązane problemy