将盐用于登录系统的优点


Advantages to using a salt for a login system?

我想构建自己的登录系统,以尽可能安全。使用 MD5 加密密码并使用

$password = strip_tags($password);
$password = mysql_real_escape_string($password);
$password = md5($password);

我在某些示例中看到了令牌,但并不真正了解其有用性。编辑 - 我被纠正了,这是我看到的盐而不是令牌。

它不叫令牌,它叫盐。

如果我们不加盐密码,您可能会有重复的密码哈希。

如果我和其他人有相同的密码(比如说StackOverflow)

  • 我 - StackOverflow - 84d7dc19766c446f5e4084e8fce87f82
  • 别人 - StackOverflow - 84d7dc19766c446f5e4084e8fce87f82

但是用盐,

  • 我 - StackOverflowMeSalt - 9a0126445be2d0b0bc6ab9728aae1323
  • 别人 - StackOverflowSomeone elseSalt - 66f6bd8d92f084dabd7e2dd588b2bfcb

此外,在对密码进行哈希处理时,无需对密码使用 mysql_real_escape_stringstrip_tags。这将使密码更加不安全。

盐增加了额外的安全层 - 无法再在反向MD5数据库中查找md5哈希。

例如,如果有人入侵仅使用md5($password)(密码为"somepassword")的网站,他可以在使用彩虹表的反向MD5数据库中查找您的密码,并且它将显示为纯文本。但是使用盐(盐是"W*&sju"),纯文本实际上是"W*&sjusomepassword",并且在在线数据库中找不到。

因此,在您的服务器上,在将密码输入数据库之前,先用盐散列您的密码:

md5($password . 'somesalT&^@*!');

然后要在登录时检查密码:

$hashed_password = md5($_POST['password'] . 'somesalt&^@*!');

建议:

  • 硬编码盐,所以即使有人获得数据库访问权限,他们也不会有你的盐......使您的哈希更加安全。
  • 盐的长度应至少为 3 个字符,大写、下部和特殊字符字符。
  • 要求密码长度至少为 7 个字符。因此,这将给您留下一个 10 个字符长、大、低、特殊字符的密码哈希。

之所以使用盐,是因为彩虹表的存在。

例如,password123的 MD5 哈希是 482c811da5d5b4bc6d497ffa98491e38

如果在数据库中发现了上述哈希,则可以将其与可能存在password123的已知哈希表进行比较。因此,如果找到匹配项,将知道纯文本密码。

但是,如果您使用只有您自己知道的盐,例如 mY_r4nD0m_Sa1t ,当您执行以下操作时:

md5($password.$salt);

这将产生一个f5a299746a9dbc005e423259283bc56b哈希,该哈希与上述已知的password123哈希完全不同。

在所有情况下,我都建议您使用phpass。

是的,它被称为"盐"。
通常,您在PHP中使用密码加密登录详细信息并生成随机盐。然后将盐与加密的登录详细信息一起存储在数据库中,并在解密时使用。基本上,它使每个用户的密码随机。