2011-04-06 43 views
1

(由于对我的问题有些困惑而更新)我们使用此方法生成digested_pa​​ssword,将其保存到我们的数据库中供以后查找。当我们向我们的应用程序验证用户身份时,此方法再次针对他们的输入进行运行,并且如果digested_pa​​ssword输出与我们保存在数据库中的digested_pa​​ssword匹配,我们会对其进行身份验证。我需要在PHP中为共享数据库的另一个应用程序重现此功能。Ruby中的sha512密码检索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的经验,所以请原谅我的缺乏理解。

谢谢!

回答

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 method的密码字符串。它基本上是将salt从第四个字符索引开始直接粘贴到密码中。通常盐与密码简单地连接。

我们可以使用substr复制此:

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

我使用的是现在默认hash extension在这里,因为这几乎是生成一个SHA-512散列最可靠的方法。

使用此代码,您应该能够为给定的相同密码和盐组合生成相同的散列。我不确定密码少于五个字符时的行为。


是啊,看起来像它应该工作:

[[email protected] ~]$ 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 
[[email protected] ~]$ 
[[email protected] ~]$ 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 > 
+0

我想我的问题并不十分清楚,但我们实际上是在数据库中储存了digested_pa​​ssword及其salt。当用户登录系统时,该功能针对用户输入和salt运行,并且如果数据库中的加密密码与来自此方法的digest_password匹配,我们对其进行身份验证。我只需要一个PHP的等价物来共享这个数据库的另一个应用程序。对困惑感到抱歉! – somecallmemike 2011-04-06 16:57:49

+0

@somecallmemike,在这种情况下,我在这里鞭打的功能*应该*做这项工作。 – Charles 2011-04-06 17:09:39

+0

如果字符串太短,Ruby会触发错误。所以它可能不关心PHP版本在短字符串上做什么,因为这是用于验证的。 – Matthew 2011-04-06 17:17:20

1

SHA512是一个one way hash function,这意味着你不能轻易获得任何给定输出的输入。

建立一个rainbow table是可能的,但非常昂贵。因为这是一个盐腌散列,所以它更加困难

2
function hash_password($password, $salt) 
{ 
    $salted_password = substr_replace($password, $salt, 4, 0); 
    $digested_password = hash('sha512', $salted_password); 
    return $digested_password; 
} 
+0

太棒了!在我回答问题之前没有看到您的回复。这是一个更好的实现,谢谢! – somecallmemike 2011-04-06 17:13:52

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!"; } 

感谢您的答复人。