【发布时间】: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