sha256/salt 密码密钥存储

sha256/salt password key storage

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

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;
}

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

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

I can't store the key for the encryption in the system

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

if someone got the file they could decrypt the password

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

Is my process flawed?

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