0

每次用户登录数据库时更改密码值是否是一种好方法?当用户在系统上注册新帐户时,我编写了一个散列函数来散列密码。每次用户登录时,数据库中的哈希值都会发生变化。是好还是坏?

4

1 回答 1

1

如果你自己设计了这个哈希函数,那么……这是一个非常非常糟糕的主意。你为什么需要这样的东西?如果您存储加盐 SHA-256 散列密码,则安全性就足够了。您不需要重新生成密码,它不提供任何额外的安全性。如果假设您的应用程序容易发生 SQL 注入,那么此方案将无法保护您的应用程序。如果您使用加盐和键控的 SHA-256 会好很多,如下所示:(我不是 php 编码器,我只是希望我们的应用程序是安全的)

$username = 'Admin';
$password = 'gf45_gdf#4hg';
$key = 'MySuperSecretKEY!!!!';
$salt = hash('sha256', uniqid(mt_rand(), true) . 'something random' . strtolower($username));
$hash = $salt . $password . $key;
$hash = hash('sha256', $hash);
$hash = $salt . $hash;

然后检查:

$username = 'Admin';
$password = 'gf45_gdf#4hg';

$sql = '
  SELECT
    `hash`
  FROM `users`
    WHERE
      `username` = "' . mysql_real_escape_string($username) . '"
  LIMIT 1
  ;';

$r = mysql_fetch_assoc(mysql_query($sql));

$salt = substr($r['hash'], 0, 64);
$hash = $salt . $password . $key;
$hash = hash('sha256', $hash);
$hash = $salt . $hash;

if ( $hash == $r['hash'] ) {
  //OK
}

因此,即使攻击者能够欺骗他不知道的加盐算法,一个密钥,他也无法在 SQL 注入攻击中重现有效的散列。

于 2012-12-04T17:27:57.277 回答