我认为我的标题不适合我的问题。 我的问题是我有一个simle登录系统只是为了测试目的,我使用sha1加密我的密码到我的数据库。看起来像这样
sha1($_POST['..some_variable...'])
以纯文本格式检索加密密码以进行身份验证的最佳方法是什么。 比如从我的数据库中选择我的用户名和密码。
答案 0 :(得分: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();
}
但我建议使用PHP password_verify
由于您可能尚未使用PHP 5.5,因此可以使用this class
答案 1 :(得分:0)
当用户创建帐户和/或密码时,您需要做的第一件事就是创建随机盐。
$salt = hash_hmac('sha512', "RandomStringHere", "EncryptionKeyHere");
您将在db中存储该salt及其加密密码。从那里加密基于文本的密码并将其存储在数据库中。
$encyptPassword = hash_hmac('sha512', "plainTextPassword" . $salt , "EncryptionKeyHere");
所以现在你有一个与用户相关的盐和加密密码 要对它进行身份验证就像获取与用户关联的盐一样简单,使用未加密的密码并对其进行加密 - 看它是否匹配。
通过这种方式,您永远不会知道人员密码,只要他们在尝试登录时匹配。