2012-04-17 5 views
6

Odnawiam stronę z Ruby na Railsach do PHP. Potrzebuję wygenerować hasła generowane przez Devise Gem w Ruby on Rails. Muszę wiedzieć, jaka jest metoda hashowania hasła, aby stworzyć tę samą metodę z PHP. ale nie jest łatwo znaleźć kody wewnątrz Ruby on Rails jako początkujący. Jeśli ktoś wie, gdzie powinienem go sprawdzić, pomóż mi.Jak wygenerować hasło w PHP, tak jak robił to Devise Gem w Ruby on Rails

Te dwa są wszystko co znalazłem:

1) The configuration of encryptor is disabled in devise.rb like below: 
    # config.encryptor = :sha1 
2) I read the comments very carefully then I found that they using sha512 and bcrypt as default encryptor. 
    # (default), :sha512 and :bcrypt. Devise also supports encryptors from others 

próbowałem popełnić tego samego zaszyfrowanego hasła w różny sposób z PHP:

1) sha1('--'.$password_salt.'--'.$encrypted_password); 
2) sha1($password_salt.'-----'.$encrypted_password); 
3) sha1('--'.$password_salt.'--'.$encrypted_password.'--'); 
4) sha1($password_salt.$encrypted_password); 
5) sha1($encrypted_password.$password_salt); 
6) substr(hash('sha512', $password_salt.$encrypted_password, false), 20); 
7) substr(hash('sha512', $encrypted_password.$password_salt, false), 0, 40); 
8) hash('sha512', $encrypted_password.$password_salt, false); 
9) hash('sha512', $password_salt.$encrypted_password, false); 
10) substr(hash('sha512', '--'.$password_salt.'--'.$encrypted_password.'--', false), 0, 40); 

nie mogłem uzyskać ten sam wynik z dowolnego powyżej. Czy jest ktoś, kto mógłby mi podać metodę szyfrowania Devise Gem?

POMÓŻ MI !!!

ps. Nie jestem dobry z angielskiego. Nawet jeśli mój angielski nie jest poprawny, proszę się nie gniewać.


ja odpowiadając sobie:

  1. szyfratora jest SHA1

    Szukałem tylko "devise.rb" w folderze "\ config \ inicjalizatorów" szyfratora została commanted jako "# config.encryptor =: sha1" Ale jest jeszcze jedno "devise.rb" wewnątrz folderu Ruby lib, "\ Ruby191 \ lib \ ruby ​​\ gems \ 1.9.1 \ gems \ devise-1.0.8 \ lib \ devise.rb " Jest jeszcze jeden konfigurat ion jako "@@ szyfratora: SHA1 ="

  2. Encryption Metoda z zastosowaniem SHA1 Kiedy idziesz do pliku poniżej widać kody algorytmu: \ Ruby191 \ lib \ ruby ​​\ klejnotów \ 1.9.1 \ klejnotów \ opracować-1.0.8 \ lib \ Devise \ encryptors \ sha1.rb

    wymagać "przetrawić/SHA1"

    moduł opracować modułu encryptors # = SHA1 # Używa algorytmu SHA1 hash do szyfrowania haseł. klasa SHA1 < Baza

     # Gererates a default password digest based on stretches, salt, pepper and the 
         # incoming password. 
         def self.digest(password, stretches, salt, pepper) 
          digest = pepper 
          stretches.times { digest = self.secure_digest(salt, digest, password, pepper) } 
          digest 
         end 
    
         private 
    
         # Generate a SHA1 digest joining args. Generated token is something like 
         #  --arg1--arg2--arg3--argN-- 
         def self.secure_digest(*tokens) 
          ::Digest::SHA1.hexdigest('--' << tokens.flatten.join('--') << '--') 
         end 
    
        end 
    end 
    

    koniec

Więc tłumaczona na PHP

function encrypt_password($salt, $password) { 
    $pepper = ''; 
    $digest = $pepper; 
    $stretches = 10; 

    for ($i=0; $i<$stretches; $i++) { 
     $join = '--'.$salt.'--'.$digest.'--'.$password.'--'.$pepper.'--'; 
     $digest = Sha1($join); 
    } 
    $result = substr($digest, 0, 40); 
    return $result; 
} 

to działa bardzo dobrze :-)

+1

Czy możesz dać mi hasło/opracowania szyfrowane pary hasło dla celów testowych? Obecnie czytam źródła danych dla prawidłowej odpowiedzi i chcę je przetestować. – GergelyPolonkai

+0

Szybki przegląd kodu źródłowego Devise na GitHub sugeruje, że oprócz dodawania soli (która powinna się zmienić dla każdego użytkownika) do wartości mieszania, program Devise dodaje także wartość papryki (która jest taka sama dla każdej instalacji) do wartości mieszania , który jest odczytywany z konfiguracji Devise. Więc możesz potrzebować znać tę wartość z pliku konfiguracyjnego. (Nie jestem programistą z Ruby, przepraszam, jeśli źle odczytuję ...) – Jazz

+0

Ostatni raz wiedziałem ... Devise używał Bcrypt ... Miałem podobny problem z Coldfusion i właśnie nazwałem bibliotekę Java jako obiekt. Dunno, jeśli PHP może to zrobić ... –

Odpowiedz

0

Według źródeł Devise klejnot, metoda jest nieco bardziej skomplikowana.część SHA512 będzie wyglądać mniej więcej tak:

function sha512_digest($password, $stretches, $salt, $pepper) 
{ 
    $digest = $pepper; 
    for ($i = 0; $i < $stretches; $i++) 
    { 
     $digest = hash('sha512', '--' . $salt . '--' . $digest . '--' . $password . '--' . $pepper . '--'); 
    } 
} 

BCrypt część jest trochę niejasna dla mnie, jedyną rzeczą, zorientowali się, że do tej pory jest to szyfrowanie Blowfish.

1

Kod Devise wygląda następująco:

def self.digest(password, stretches, salt, pepper) 
    ::BCrypt::Engine.hash_secret("#{password}#{pepper}",salt, stretches) 
end 

Można zobaczyć, jak to zrobić bcrypt w PHP przy How do you use bcrypt for hashing passwords in PHP?

Domyślnie Devise korzysta z 10 odcinków.

Sól wygląda na pierwsze 29 znaków zaszyfrowanego hasła. Możesz zrobić (w szynach): User.first.authenticable_salt

Papryka powinna być wymieniona w config/initializers/devise.rb, ale może używać swojego tajnego tokena aplikacji.

proszę zobaczyć https://github.com/plataformatec/devise/blob/master/lib/devise/models/encryptable.rb