【发布时间】:2012-04-29 07:16:21
【问题描述】:
我正在将一个网站从 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的加密方法吗?
帮帮我!!!
ps。我不擅长英语。即使我的英语不正确,请不要生气。
我在回答自己:
-
加密器是 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
需要“digest/sha1”
模块设计 模块加密器 # = 沙1 # 使用 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;
}
效果很好:-)
【问题讨论】:
-
您能否给我一个密码/设计加密密码对以用于测试目的?我目前正在阅读设计资源以获得正确答案,我想测试一下。
-
快速浏览 GitHub 上的 Devise 源代码表明,除了向哈希添加盐(应该为每个用户更改)之外,Devise 还添加了一个胡椒值(这是相同的对于每个安装)到从设计配置中读取的哈希值。因此,您可能需要从配置文件中知道该值。 (我不是 Ruby 程序员,如果我读错了,请见谅......)
-
最后我知道... Devise 使用的是 Bcrypt... 我在 Coldfusion 中遇到了类似的问题,只是将 Java 库称为对象。不知道 PHP 能不能做到这一点……
标签: php ruby-on-rails encryption devise