Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 正在检索sha1加密密码。。_Php_Encryption_Sha1 - Fatal编程技术网

Php 正在检索sha1加密密码。。

Php 正在检索sha1加密密码。。,php,encryption,sha1,Php,Encryption,Sha1,我认为我的题目不适合我的问题。 我的问题是,我有一个简单的登录系统,只是为了测试,我正在使用sha1将我的密码加密到我的数据库中。看起来像这样 sha1($_POST['..some_variable...']) 出于身份验证目的,以纯文本形式检索加密密码的最佳方法是什么。 比如从我的数据库中选择我的用户名和密码。这会让你对它的工作原理有一个很好的了解 try { $submittedEmail = !empty($_GET['email']) ? $_GET['email']: fal

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

sha1($_POST['..some_variable...'])
出于身份验证目的,以纯文本形式检索加密密码的最佳方法是什么。
比如从我的数据库中选择我的用户名和密码。

这会让你对它的工作原理有一个很好的了解

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


由于您可能不在PHP5.5上,因此当用户创建帐户和/或密码时,您可以使用

,您需要做的第一件事就是创建一个随机的salt

$salt = hash_hmac('sha512', "RandomStringHere", "EncryptionKeyHere");
您将在db中存储该盐及其加密密码。从那里加密基于文本的密码,并将其存储在数据库中

$encyptPassword = hash_hmac('sha512', "plainTextPassword" . $salt , "EncryptionKeyHere");
因此,现在您有了一个与用户关联的salt和加密密码。
要进行身份验证,只需获取与用户相关联的salt,获取用户未加密的密码并对其进行加密—查看密码是否匹配


这样,您永远不会知道用户的密码,只要他们尝试登录时密码匹配即可。

(简而言之,您不知道-SHA-1是散列,而不是双向加密方案。)您真正想做的是对用户提交的密码进行散列,并将该散列与存储在数据库中的散列进行比较。请注意,您不应该在生产环境中使用md5/sha1。。。因为这些天它们很容易破解。@Sammitch我不会把SHA-1形容为“不可思议的容易破解”…@DuncanJones SHA1,是的。它有一个密码漏洞,大大缩短了破解时间。SHA2/256/512/etc没有提到漏洞,但与现代破解方法和bcrypt等散列方案相比仍然很弱。谢谢先生!我刚刚发现,为了检索散列,您还必须对输入进行散列,然后从数据库中选择散列。@Edgar:这就是我在22小时前的评论中所说的:是的,我刚刚重复了它lol。。无论如何再次感谢:)