使用salt登录系统的优点是什么?

时间:2012-05-31 18:15:26

标签: php login token

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

剥离额外数据
$password = strip_tags($password);
$password = mysql_real_escape_string($password);
$password = md5($password);

我在一些例子中看到了令牌,但并不真正理解它的用处。 编辑 - 我被纠正了,它是盐,而不是我见过的令牌。

4 个答案:

答案 0 :(得分:4)

它不被称为令牌,它被称为盐。

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

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

  • 我 - StackOverflow - 84d7dc19766c446f5e4084e8fce87f82
  • 其他人 - StackOverflow - 84d7dc19766c446f5e4084e8fce87f82

但是用盐,

  • 我 - StackOverflowMeSalt - 9a0126445be2d0b0bc6ab9728aae1323
  • 其他人 - StackOverflowSomeone elseSalt - 66f6bd8d92f084dabd7e2dd588b2bfcb

此外,密码在散列时无需使用mysql_real_escape_stringstrip_tags。这会使密码更加不安全。

答案 1 :(得分:4)

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

例如,如果有人攻击您的网站仅使用md5($ password)(密码为'somepassword'),他可以在使用Reverse MD5 Databaserainbow tables中查找您的密码,将显示为纯文本。但是使用盐(盐是'W *& sju'),纯文本实际上是“W *& sjusomepassword”,并且不会在在线数据库中找到。

因此,在您的服务器上,在将密码输入数据库之前使用salt哈希密码:

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

然后在登录时检查密码:

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

建议:

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

答案 2 :(得分:2)

你之所以使用盐,是因为rainbow tables存在。

例如,password123的MD5哈希值为482c811da5d5b4bc6d497ffa98491e38

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

但是,如果您执行以下操作,则使用仅为您所知的盐,例如mY_r4nD0m_Sa1t

md5($password.$salt);

这会生成f5a299746a9dbc005e423259283bc56b的哈希值,这与上面password123的已知哈希值完全不同。

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

答案 3 :(得分:1)

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