(由于对我的问题有些混淆而更新)我们使用此方法生成一个digested_password,它被保存到我们的数据库中供以后查找。当我们向我们的应用程序验证用户时,此方法再次针对其输入运行,如果digested_password输出与我们保存在数据库中的digested_password匹配,则我们对它们进行身份验证。我需要在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的经验所以请原谅我缺乏理解。
谢谢!
答案 0 :(得分: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。它基本上将盐拼接到密码中,从第四个字符索引开始。通常,盐只是与密码连接在一起。
我们可以使用substr
复制此内容:
function hash_password($password, $salt) {
$salted_password = substr($password, 0, 4) . $salt . substr($password, 4);
return hash('sha512', $salted_password);
}
我在这里使用now-default hash extension,因为它几乎是生成SHA-512哈希的最可靠方法。
使用此代码,您应该能够为给定的相同密码和salt组合生成相同的哈希值。我不确定密码少于五个字符时的行为是什么。
是的,看起来应该有效:
[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 >
答案 1 :(得分:2)
function hash_password($password, $salt)
{
$salted_password = substr_replace($password, $salt, 4, 0);
$digested_password = hash('sha512', $salted_password);
return $digested_password;
}
答案 2 :(得分:1)
SHA512是one way hash function,这意味着您无法轻松获取任何给定输出的输入。
构建rainbow table是可能的,但非常昂贵。因为这是一个咸味的哈希,所以更难“
答案 3 :(得分: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!"; }
感谢您的回复人员。