0

我认为我的标题不适合我的问题。我的问题是我有一个仅用于测试目的的简单登录系统,并且我正在使用 sha1 将我的密码加密到我的数据库中。看起来像这样

sha1($_POST['..some_variable...'])

将我的加密密码作为纯文本检索以进行身份​​验证的最佳方法是什么。就像从我的数据库中选择我的用户名和密码一样。

4

2 回答 2

0

这应该让您很好地了解它是如何工作的。

try {

  $submittedEmail = !empty($_GET['email']) ? $_GET['email']: false;
  $submittedHash = !empty($_GET['password']) ? hash('sha1', $_GET['password']): false;

  if (!$submittedEmail || !$submittedHash) {
    throw new \Exception('Required field(s) missing. Please try again.');
  }

  if ($stmt = $mysqli->prepare("SELECT hash FROM user WHERE email = ?")) {
    $stmt->bind_param("s", $submittedEmail);
    $stmt->execute();
    $stmt->bind_result($storedHash);
    $stmt->fetch();
    $stmt->close();
  }

  if (!$submittedHash != $storedHash) {
    throw new \Exception('Wrong credentials submitted. Please try again.');
  }

  echo 'User ok!';

} catch (Exception $e) {
  echo $e->getMessage();
}

但是,我建议使用 PHPs password_verify

由于您可能不在 PHP 5.5 上,但您可以使用此类

于 2013-08-27T18:01:08.693 回答
0

当用户创建帐户和/或密码时,您需要做的第一件事就是创建一个随机盐。

$salt = hash_hmac('sha512', "RandomStringHere", "EncryptionKeyHere");

您将把盐连同他们的加密密码一起存储在 db 中。从那里加密基于文本的密码并将其存储在数据库中。

$encyptPassword = hash_hmac('sha512', "plainTextPassword" . $salt , "EncryptionKeyHere");

所以现在你有一个与用户关联的盐和加密密码。
要进行身份验证,就像获取与用户相关联的盐一样容易,获取他们未加密的密码并对其进行加密 - 看看它是否匹配。

这样,您永远不会知道人员密码,只要他们尝试登录时密码匹配。

于 2013-08-27T18:10:42.007 回答