1

(由于对我的问题有些困惑而更新)我们使用此方法生成一个digested_pa​​ssword,将其保存到我们的数据库中以供以后查找。当我们对应用程序的用户进行身份验证时,此方法会再次针对他们的输入运行,如果 digested_pa​​ssword 输出与我们保存在数据库中的 digested_pa​​ssword 匹配,我们将对其进行身份验证。我需要在 PHP 中为另一个共享数据库的应用程序重现这个函数。

def self.hash_password( password, salt )
  salted_password = password.insert 4, salt
  digested_password = Digest::SHA512.hexdigest("#{salted_password}")
  return digested_password
end

我真的没有使用 Ruby 的经验,所以请原谅我缺乏理解。

谢谢!

4

4 回答 4

2

因为您无法从像 SHA-512 这样的单向哈希中“检索”密码,所以我们能得到的最接近的方法是能够从相同的密码和盐生成相同的哈希。让我们看一下 Ruby 代码:

def self.hash_password( password, salt )
  salted_password = password.insert 4, salt
  digested_password = Digest::SHA512.hexdigest("#{salted_password}")
  return digested_password
end

这里唯一有点“奇怪”的是对密码字符串.insert方法的调用。它基本上是将盐直接拼接到密码中,从第四个字符索引开始。通常盐只是简单地与密码连接。

我们可以使用以下方法复制它substr

function hash_password($password, $salt) {
    $salted_password = substr($password, 0, 4) . $salt . substr($password, 4);
    return hash('sha512', $salted_password);
}

我在这里使用现在默认的哈希扩展,因为它几乎是生成 SHA-512 哈希的最可靠方法。

使用此代码,您应该能够为给定的相同密码和盐组合生成相同的哈希值。我不确定当密码长度少于五个字符时会发生什么行为。


是的,看起来它应该工作:

[charles@lobotomy ~]$ irb
irb(main):001:0> require 'digest/sha2'
=> true
irb(main):002:0> def hash_password( password, salt )
irb(main):003:1>   salted_password = password.insert 4, salt
irb(main):004:1>   digested_password = Digest::SHA512.hexdigest("#{salted_password}")
irb(main):005:1>   return digested_password
irb(main):006:1> end
=> nil
irb(main):007:0* puts hash_password('password', 'salt')
92d3efdbf51d199b0930c427b77dc8d5cf41ac58b6fab5f89cc3f32d719a8f6ffcdff6211bdd0565a6e7b09925839e5dcce1fa5abf65eca87c6a883ab0b510b9
=> nil
irb(main):018:0> exit
[charles@lobotomy ~]$ 
[charles@lobotomy ~]$ php -a
Interactive shell

php > function hash_password($password, $salt) {
php {     $salted_password = substr($password, 0, 4) . $salt . substr($password, 4);
php {     return hash('sha512', $salted_password);
php { }
php > echo hash_password('password', 'salt');
92d3efdbf51d199b0930c427b77dc8d5cf41ac58b6fab5f89cc3f32d719a8f6ffcdff6211bdd0565a6e7b09925839e5dcce1fa5abf65eca87c6a883ab0b510b9
php >
于 2011-04-06T16:55:20.017 回答
2
function hash_password($password, $salt)
{
  $salted_password = substr_replace($password, $salt, 4, 0);
  $digested_password = hash('sha512', $salted_password);
  return $digested_password;
}
于 2011-04-06T17:11:26.033 回答
1

SHA512一种单向哈希函数,这意味着您无法轻松获取任何给定输出的输入。

建造彩虹桌是可能的,但非常昂贵。因为这是加盐哈希,所以更难

于 2011-04-06T16:48:55.650 回答
0

我想到了。我不太了解 Ruby 中的 insert 方法,结果发现 salt 是在密码的第四个字符处插入的。这是 PHP 的等价物:

$password_input = "derpaderp";
$password_salt = "aderp";
$arg=substr_replace($password_input, $password_salt, 4, 0);
$pass = hash('sha512', $arg);
if ( $digested_password_from_database == $pass ){ echo "success!"; }

谢谢大家的回复。

于 2011-04-06T17:12:46.823 回答