Я обновляю веб-сайт от Ruby on Rails до PHP. Мне нужно сгенерировать пароли, которые генерируются Devise Gem в Ruby on Rails. Я должен знать, что такое метод хэширования пароля для создания того же метода с PHP. но не легко найти коды внутри Ruby on Rails в качестве новичка. Если кто-то знает, где я должен проверить, чтобы найти его, пожалуйста, помогите мне.
Эти два – все, что я нашел:
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
Я попытался сделать тот же зашифрованный пароль по-разному с 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);
Я не мог получить тот же результат от любого из вышеперечисленных. Есть ли кто-нибудь, кто мог бы сказать мне метод шифрования Devise Gem?
ПОМОГИ МНЕ!!!
пс. Я не очень хорошо владею английским языком. Даже если мой английский не подходит, пожалуйста, не сердитесь.
Я отвечаю:
Шифрование – Sha1
Я искал только «devise.rb» в папке «\ config \ initializers». Шифр был зачислен как «# config.encryptor =: sha1». Но есть еще один «devise.rb» внутри папки Ruby lib, «\ Ruby191 \ lib \ ruby \ gems \ 1.9.1 \ gems \ devise-1.0.8 \ lib \ devise.rb "Есть еще одна конфигурация как" @@ encryptor =: sha1 "
Метод шифрования с использованием Sha1. Когда вы перейдете к файлу ниже, вы увидите коды для алгоритма: \ Ruby191 \ lib \ ruby \ gems \ 1.9.1 \ gems \ devise-1.0.8 \ lib \ devise \ encryptors \ sha1.rb
требуют «digest / sha1»
модуль Devise module Encryptors # = Sha1 # Использует алгоритм хэша Sha1 для шифрования паролей. класс Sha1 <Base
# 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
конец
Поэтому я перевел на 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; }
он работает очень хорошо 🙂
Код разработки выглядит так:
def self.digest(password, stretches, salt, pepper) ::BCrypt::Engine.hash_secret("#{password}#{pepper}",salt, stretches) end
Вы можете увидеть, как сделать bcrypt в PHP, как вы используете bcrypt для хеширования паролей в PHP?
По умолчанию Devise использует 10 растяжек.
Соль выглядит как первые 29 символов зашифрованного пароля. Вы можете сделать (в рельсах) User.first.authenticable_salt
Перец должен быть указан в config/initializers/devise.rb
но он может использовать секретный токен вашего приложения.
См. https://github.com/plataformatec/devise/blob/master/lib/devise/models/encryptable.rb
Согласно источникам Devise Gem, этот метод немного сложнее. часть SHA512 будет выглядеть примерно так:
function sha512_digest($password, $stretches, $salt, $pepper) { $digest = $pepper; for ($i = 0; $i < $stretches; $i++) { $digest = hash('sha512', '--' . $salt . '--' . $digest . '--' . $password . '--' . $pepper . '--'); } }
Часть BCrypt для меня неясна, единственное, что я выяснил до сих пор, это то, что это шифрование Blowfish.