php - PHP 中的密码哈希 : Am I Doing This Right?

标签 php mysql function hash passwords

我正在尝试使用 PHP 创建一个登录系统,但我不太确定我的脚本是否真的很好,请查看下面的内容。

因此,我创建了两个函数...其中一个用于创建哈希,另一个用于检查它。

查看功能:

function createSaltedPass($pass = false, $username = false) {
  if($pass && $username)
  {
    $salt = hash('sha256', uniqid( mt_rand(), true ) . md5(date('d m Y H i s') . " # ") . $username);

    $pass = hash('sha256', $salt . $pass . $salt);

    $pass = $salt . $pass;

    return $pass;
  }
}

上面的代码片段创建了一个巨大的散列(具体为 128 个字符),我不知道它是否真的安全。

前半部分是盐,它让我可以在需要的时候查看它。

后半部分是真正的加盐密码。

查看密码示例:

939cf87873a402d48bcf66a57b64ca38d6f1db9155381ffe1aae9a469e93d1e7ec338071f2dd21a96ef5fc799a3f3921b0df3188458b17422db79271056a1fda

使用第一个函数后看一下检查密码的函数:

function checkSaltedPass($dbPass = false, $pass = false) {
  if($pass && $dbPass)
  {
    $salt = substr($dbPass, 0, 64);

    $pass = hash('sha256', $salt . $pass . $salt);

    $pass = $salt . $pass;

    return $pass;
  }
}

你对此有何看法?我不是安全方面的专家,如果有人能给我提示,我将不胜感激。

还有一件事:处理 session 以保持用户登录的更好方法是什么?

(抱歉英语不好,这不是我的母语)。

最佳答案

在这种情况下,很明显密码是与两个 sha1 哈希字符串连接在一起的,攻击者更容易通过检查两个哈希值来暴力破解它,而盐在这里有点毫无意义,因为看看你的代码:什么是你所做的只是......根本不检查它!

在我看来,您可以稍后将静态安全盐与静态用户信息(例如注册日期、注册 IP 等)连接起来。

那么用法将如下所示:

$pass = sha1($password . $staticSalt . $registerDate);

这样做的好处是,即使攻击者会发现暴力冲突,那么在将找到的字符串放入 password 字段后,密码将计算为:

$bruteForcedPassword . $staticSalt . $registerDate

这仍然与用户的散列密码不同。

在此方法中,攻击者必须知道您的静态安全盐、构建密码字符串的方法以及用户的注册日期(或组合到密码中的其他内容)。

另请阅读 timing attacks

编辑: 或者只是使用这个 library for password hashing

关于php - PHP 中的密码哈希 : Am I Doing This Right?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9852000/

相关文章:

php - 在 PHP 中将数据从 SQL 转换为字符串

php - 没有创建数据库的 Symfony 2.7 应用程序

python-3.x - 如何制作杂货收据程序

php - 使用 Paypal-Php-SDK 创建发票失败并出现 "Can not deserialize instance of java..."错误

PHP:使用名称从列中获取值

mysql - Mac 无法启动 MYSQL 服务器

c++ - 将函数内容打印为字符串,但也可以将其作为代码运行

c# - 如何使用 Azure Functions 解析表单数据

php - 可捕获的 fatal error :传递给“...\FormType::__construct() 的参数 1 必须实现接口(interface)

php - 大型 MySQL 查询运行时网站响应缓慢(所有其他用户)