用于存储密码的哈希技术


Hashing technique for storing password

可能的重复项:
PHP 密码的安全哈希和盐

三部分问题:

  • 我应该使用哪种技术来存储密码?(SHA1、SHA256/512 等)
  • 盐的理想大小是多少?
  • 我应该使用什么?

    $passwordHash = hash('ENCRYPTION',$salt . $password);    
    

     $passwordHash = hash('ENCRYPTION',$password . $salt);
    

我打算只存储论坛密码。我不存储银行凭证或任何其他高度敏感的项目。它应该是快速的,而不是火箭科学。

我使用了MD5,但由于已知它已损坏,我现在使用SHA-2

$hash = hash('sha256', $pass); - creates 256 bit hash.

就个人而言,我仍然会使用 MD5 - 它非常快速且广泛实现。

尽管安全研究人员已经找到了一种方法来制作两个文本块,从而产生相同的MD5哈希("碰撞攻击"),但没有已知的实用方法来创建一个产生特定哈希的文本块("前图像攻击")

只要确保你有一个合适的长度盐(16个随机字节应该绰绰有余),以确保黑客不能使用"彩虹表"来反转你的哈希值。

在我看来,如果可用,您应该使用 SHA512,因为它是目前可用的最强大的哈希算法之一。

关于盐的大小,我会使用与哈希相同大小的盐大小,因为它为哈希增加了更多的熵。我将 uniqid() 函数与 rand() 函数结合使用

我会使用类似于下面的代码

<?php
    $password = 'password';
    //Generate the salt
    $salt = hash('sha512',uniqid('',true) . rand());
    //Hash our password with the salt
    $passwordHash = hash('sha512',$salt . $password);
?>
  1. 任何如你所说 - 它不是那么敏感
  2. 任何,但如果你想要精确的数字,让它成为 32
  3. 任何,作为盐的主要目的是不要给坏人确定,两个密码是否相同。

例如,我是某个系统的开发人员,并决定仅存储登录密码哈希:

User1:qjwhegwqe7865WEQ786ew7Q8用户2:KL21J3KL21J3KL21J3KL12JK用户3:qjwhegwqe7865weq786ew7q8

如您所见,如果没有盐,坏人会看到,用户 1 和用户 3 具有相同的密码。这就是盐被发明的原因——它总是创建不同的哈希值。这只是它的目的之一。