使用SHA2,mcrypt_create_iv,salt和MD5从PHP存储MySQL中的密码

时间:2015-01-08 19:47:31

标签: php mysql passwords

我正在使用这个php脚本将用户名和密码存储到我的MYSQL数据库中:

$nombre = $_POST['username'];
$password = $_POST['password'];
$stringpass = md5( $password . 'AAA');

$size = mcrypt_get_iv_size(MCRYPT_CAST_256, MCRYPT_MODE_CFB);
$salt = mcrypt_create_iv($size, MCRYPT_RAND );
mysqli->query("INSERT INTO users(username,salt,password) VALUES ('$nombre','$salt',SHA2(CONCAT('$salt','$stringpass'), 512))"))

在MYSQL中正确创建记录。但是,当我尝试登录时,此脚本无法识别我的密码:

$nombre = $_POST['username'];
$password = $_POST['password'];
$stringpass = md5( $password . 'AAA');
$resultado = $mysqli->query("select * from users where username='$nombre' and password = SHA2(CONCAT(salt,'$stringpass'), 512)")

这对我没有任何结果。什么可以丢失的想法?也许是盐场的参考,但不知道如何做到这一点。

让我清楚一点,此代码不适用于任何生产环境。它适用于学校项目,仅用于设计简单用户身份验证脚本的演示目的。这就是说,我真的想知道这段代码中可能出现什么问题,或者我需要在PHP / MySQL环境中检查哪些具体配置。

2 个答案:

答案 0 :(得分:4)

我不确定究竟是什么问题,但这可能有所帮助。

Php提供了一种更简单的替代方法,可自动生成salt和hash - password_hash()函数。你只做password_hash($password, PASSWORD_BCRYPT);,它会生成一个盐,用它来哈希密码,并将盐附加到哈希的前面。

这是文档页面。

http://php.net/manual/en/function.password-hash.php

答案 1 :(得分:0)

生成的salt是二进制字符串,因此您不能将其插入到SQL语句中,您必须使用预准备语句或转义。

无论出现此问题,这都不是存储密码的安全方法。 SHA- *算法不适合散列密码,而应使用具有成本因子的慢速算法(BCrypt,PBKDF2)。

PHP现在提供了一种使用password_hash()函数生成安全密码哈希的更简单方法(早期版本的compatibility pack也可用)。 salt成为哈希值的一部分,因此无需将其单独存储在数据库中。

// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);

// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from $existingHashFromDb.
$isPasswordCorrect = password_verify($password, $existingHashFromDb);