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() 函数的用途。使用它。
我创建了一个注册表,处理如下:
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() 函数的用途。使用它。