在PHP代码中存储哈希密码,它是否安全?

时间:2016-03-01 12:47:41

标签: php security login

我需要一个只显示授权用途的页面。所以我打算使用会话。 只有一个用户,密码不会改变。所以我打算做这样的事情

<?php
session_start();

if(isset($_POST['password']) )
{
    if($_POST['password']=="myhashedpassword" )
    {
        // auth okay, setup session
        $_SESSION['user'] = $_POST['username'];

        // redirect to required page
        header( "Location: index.php" );
     } else {
        // didn't auth go back to loginform
        header( "Location: loginform.html" );
     }
 } else {
     // username and password not given so go back to login
     header( "Location: loginform.html" );
 }

?>

我想知道这种方法的安全性。我不需要完全安全......希望它公平。

3 个答案:

答案 0 :(得分:3)

总的来说,我认为这会令人不悦,但并不是完全没有安全感,因为他们没有看到明文密码。它消除了有人访问数据库以获取哈希值然后尝试强制它的需要。所以更容易一点。

此外,如果($ _ POST [&#39;密码&#39;] ==&#34; myhashedpassword&#34;),这将无效,因为您正在将散列密码与帖子中的明文密码进行比较。所以你真的需要做

if( hash_algo($_POST['password']) == "myhashedpassword" ){//stuff}

我的建议是将此作为普通身份验证执行,或者为有权访问该页面并检查该页面的用户帐户添加标记。

答案 1 :(得分:3)

我不愿意这样做的三个原因:

  1. 您将明文密码($_POST['password'])与常量字符串进行比较。即使常量字符串经过哈希处理,您的密码也不会,因此您现在可以有效地将哈希值作为密码处理。 Pass the hash
  2. Timing attacks
  3. Using == to compare hashes in PHP会导致不可预测的结果。

答案 2 :(得分:2)

永远不要硬编码密码。一些原因是:

  • 保持源代码的密钥比密钥更难。
  • 您网站中允许阅读源代码的任何漏洞都可能泄露密码。
  • 开发中的密码将最终投入生产。
  • 如果不重新部署,就不可能更改密码(你说它不会改变,但是如果发生违规,你会怎么做?)。