(由于对我的问题有些混淆而更新)我们使用此方法生成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的经验,所以请原谅我的理解不足。
谢谢!
因为你不能从像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
方法的调用。它基本上是将salt直接拼接到密码中,从第四个字符索引开始。通常盐类只是简单地与密码连接在一起。
我们可以使用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 >
function hash_password($password, $salt)
{
$salted_password = substr_replace($password, $salt, 4, 0);
$digested_password = hash('sha512', $salted_password);
return $digested_password;
}
SHA512是单向哈希函数,这意味着您无法轻松获得任何给定输出的输入。
制作彩虹表是可能的,但非常昂贵。因为这是加盐散列,所以更困难
我明白了。我不太理解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!"; }
感谢大家的回复