0

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

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

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

4

4 回答 4

4

它不叫令牌,它叫盐。

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

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

  • StackOverflow——84d7dc19766c446f5e4084e8fce87f82
  • 别人StackOverflow——84d7dc19766c446f5e4084e8fce87f82

但加了盐,

  • StackOverflowMeSalt——9a0126445be2d0b0bc6ab9728aae1323
  • 别人StackOverflowSomeone elseSalt——66f6bd8d92f084dabd7e2dd588b2bfcb

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

于 2012-05-31T18:17:19.863 回答
4

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

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

因此,在您的服务器上,在将密码输入数据库之前,先用盐对密码进行哈希处理:

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

然后在登录时检查密码:

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

建议:

  • 对盐进行硬编码,因此即使有人要获得数据库访问权限,他们也不会拥有您的盐……使您的哈希更加安全。
  • 盐应该至少有 3 个字符长,大写、小写和特殊字符。
  • 要求密码长度至少为 7 个字符。因此,这将为您留下一个 10 个字符长、大写、小写、特殊字符的密码哈希。
于 2012-05-31T18:28:22.403 回答
2

您使用盐的原因是因为存在彩虹表

例如, 的 MD5 哈希password123482c811da5d5b4bc6d497ffa98491e38.

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

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

md5($password.$salt);

这将产生一个f5a299746a9dbc005e423259283bc56b与上述已知散列完全不同的散列password123

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

于 2012-05-31T18:34:50.783 回答
1

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

于 2012-05-31T18:23:00.797 回答