【问题标题】:sha256/salt password key storagesha256/salt密码密钥存储
【发布时间】:2015-10-19 06:08:52
【问题描述】:

我创建了一个注册表单,处理如下:

function register_user() {
   global $conn;
   $name      = sanitize($_POST['name']);
   $email     = sanitize($_POST['email']);
   $password = sanitize($_POST['password']);
   $salt      = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM));

   $saltedPW = $password . $salt;
   $hashedPW = hash('sha256', $saltedPW);

   mysqli_query($conn, "INSERT INTO users (name, email, password, salt) VALUES ('$name', '$email', '$hashedPW', '$salt')");

然后按如下方式处理登录表单:

    function login($email, $password) {
    global $conn;
    $user_id = user_id_from_username($email);
    $query   = mysqli_query($conn, "SELECT salt FROM users WHERE email = '$email'");
    $row1    = mysqli_fetch_assoc($query);
    $salt    = $row1['salt'];

    $saltedPW = $password . $salt;
    $hashedPW = hash('sha256', $saltedPW);

    $result = mysqli_query($conn, "SELECT COUNT(user_id) FROM users WHERE email = '$email' AND password = '$hashedPW'");
    $row     = mysqli_fetch_row($result);

    return ($row[0] == 1) ? $user_id : false;
}

用户表的结构如下: 用户身份;姓名;电子邮件;密码; salt(用于密码恢复、管理员权限等的附加列)。将详细信息提交给我公司的 IT 合规部门后,具有 PHP 经验的人(无疑超过了我的经验)表示我无法将用于加密的密钥存储在系统中 - 如果有人得到文件,他们可以解密密码。我的问题是 - 这是正确的吗?我的流程有缺陷吗?我进行的所有研究都表明,带有随机盐的 SHA256 哈希是最好的方法之一。

【问题讨论】:

  • 为什么不直接使用password_hash() 或兼容包,让函数处理盐分。更不用说准备好的语句了。
  • 不要将盐存放在单独的列中。将其存储在密码中并具有分隔符,您可以在其中将盐与密码分开。还要看看胡椒,它基本上是一个硬编码的字符串/整数组合,这使得它更难破解。

标签: php mysql salt sha256 password-hash


【解决方案1】:

我无法在系统中存储用于加密的密钥

你没有。你在散列,你没有加密。盐!==键

如果有人得到文件,他们可以解密密码

没有。没有任何东西是加密的,所以没有什么可以解密的。他们只会得到结果哈希,他们仍然需要蛮力。

我的流程有缺陷吗?

是的,但不是因为他们的 cmets。这是有缺陷的,因为您永远不应该使用 SHA 或 MD5 或类似的密码。它们的设计速度很快,这不是您想要的。你想要一些故意占用大量 CPU 的东西,以使暴力攻击不合时宜。这正是password_hash() 函数的用途。使用它。

【讨论】:

    【解决方案2】:

    不要使用 sha256、md5 等进行密码散列。我认为您应该使用 BCrypt 进行密码散列。这是目前最强大的密码哈希算法。 password_hash()password_verify() 用于散列和验证 BCrypt 的密码。 PHP 5.5.0 或更高版本使用 BCrypt 作为password_hash() 的默认算法。不要使用自己的盐。让password_hash()为你做吧。

    【讨论】:

    • 将盐存储在环境变量中意味着您只有一个供所有用户使用,这不如为每个用户单独存储一个盐并存储它在数据库中。
    • "他将能够在几分钟内获得所有密码。"不,他将获得哈希值,而不是密码。他们仍然必须被单独蛮力强迫。但这无关紧要,因为如果他可以访问数据库,那么盐是您最不必担心的,因为他可以编写自己的新哈希。 “我也不建议在 BCrypt 和 sha256 中使用盐。”不,总是使用盐。 password_hash() 的好处在于它会自动为您完成。
    猜你喜欢
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    • 2019-08-11
    • 1970-01-01
    • 2019-03-10
    • 2017-04-11
    • 2018-09-18
    • 1970-01-01
    相关资源
    最近更新 更多