因为你不能从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 >
我想我的问题并不十分清楚,但我们实际上是在数据库中储存了digested_password及其salt。当用户登录系统时,该功能针对用户输入和salt运行,并且如果数据库中的加密密码与来自此方法的digest_password匹配,我们对其进行身份验证。我只需要一个PHP的等价物来共享这个数据库的另一个应用程序。对困惑感到抱歉! – somecallmemike 2011-04-06 16:57:49
@somecallmemike,在这种情况下,我在这里鞭打的功能*应该*做这项工作。 – Charles 2011-04-06 17:09:39
如果字符串太短,Ruby会触发错误。所以它可能不关心PHP版本在短字符串上做什么,因为这是用于验证的。 – Matthew 2011-04-06 17:17:20