因为您无法从像 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 >