我正在将一个网站从 Ruby on Rails 更新为 PHP。我需要在 Ruby on Rails 中生成 Devise Gem 生成的密码。我必须知道密码的散列方法是什么,才能使用 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
我只在文件夹“\config\initializers”中查看“devise.rb” 加密器被命名为“# config.encryptor = :sha1” 但是在 Ruby lib 文件夹中还有一个“devise.rb”,“\ 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
需要“摘要/sha1”
module Devise module Encryptors # = Sha1 # 使用 Sha1 哈希算法加密密码。类 Sha1 < 基础
# 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;
}
它工作得很好:-)