【问题标题】:Store safely a password in MySQL using PHP and checking it afterwards使用 PHP 将密码安全地存储在 MySQL 中,然后进行检查
【发布时间】:2016-02-22 19:48:15
【问题描述】:

我已经阅读了几篇文章并尝试了不同的技术在 MySQL 中存储密码。我决定使用cryptsalt,我终于能够将它插入我的数据库。使用的代码如下:

    $cost = 10;
    $salt = strtr(base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)), '+', '.');
    $salt = sprintf("$2a$%02d$", $cost) . $salt;
    $hash = crypt($password, $salt);
    $query = "INSERT INTO users_registered(name , password) VALUES('$name', '$hash')"; 
    mysqli_query($con, $query);

我一直在苦苦挣扎几个小时的主要问题是如何检查我输入的密码是否正确......我确定我做错了什么,但我在这个安全领域是全新的,并且我检查的所有帖子都不适合我。这是我用来检查的代码:

$name = mysqli_real_escape_string( $con, $_POST['name'] );
$password = mysqli_real_escape_string( $con,$_POST["password"]);

$query = "SELECT * FROM users_registered where name='$name'";
$result = mysqli_query($con, $query);
$row = mysqli_fetch_assoc($result);
$hash=$row['password'];
if ($hash->hash==crypt($password, $hash->hash)) {
    echo "YEEEESSS";    
        }
else {
   echo "What I'm doing wrooooong!";}

问题来自if,但我不确定我应该放什么:S 任何帮助将不胜感激:)

【问题讨论】:

标签: php mysqli hash salt crypt


【解决方案1】:

正如在 cmets 中已经建议的那样,最好的方法是使用 password_hash() 而不是使用:

$cost = 10;
$salt = strtr(base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)), '+', '.');
$salt = sprintf("$2a$%02d$", $cost) . $salt;
$hash = crypt($password, $salt);

就我而言,我的php版本低于5.5,我无法插入库compatible with lower versions,即使这是最安全的方法!!

为了检查我存储的密码是否与用户通过$_POST输入的密码相同,if 必须修改如下:

if (crypt($password, $hash) == $hash) {
   ...

这成功了!考虑到我只是一个初学者,这种方法可能不安全:)

【讨论】:

  • 你为什么不能使用兼容包,只需包含这个php file。你运行的是哪个 PHP 版本?
  • 啊!我以为我必须安装hole库,并且我正在使用GoDaddy服务器进行所有测试,这限制了我的所有安装......他们默认使用的PHP是5.4。我可以切换到 php 5.5,但该命令均未被识别:S。尽管如此,我会尝试使用 php 文件!谢谢:)
猜你喜欢
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
  • 2017-11-07
  • 2017-03-23
  • 2015-06-12
  • 2013-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多