如何在mysql中创建和存储md5密码

时间:2011-07-21 19:54:29

标签: php mysql password-storage

可能是一个非常新手的问题,但是,我一直在阅读并发现在理解密码的创建和存储方面存在一些困难。从我所读到的md5 / hash密码是将它们存储在数据库中的最佳方式。但是,我该如何首先创建这些密码?

所以说我有一个用户名为bob的登录页面,密码为bob123   - 我怎么样 1.将bobs密码放入数据库开始(散列) 2.如何检索并确认哈希密码?

由于

9 个答案:

答案 0 :(得分:43)

编辑2017/11/09:请务必查看O Jones的答案。

首先关闭MD5并不是你可以用来尝试sha256或sha512的最大哈希方法

也就是说,我们可以使用hash('sha256')代替md5()来表示流程的哈希部分。

当您第一次创建用户名和密码时,您将使用一些盐(每个密码添加一些随机的额外字符以使其更长/更强)来散列原始密码。

可能会从创建用户表单中看到类似内容:

$escapedName = mysql_real_escape_string($_POST['name']); # use whatever escaping function your db requires this is very important.
$escapedPW = mysql_real_escape_string($_POST['password']);

# generate a random salt to use for this account
$salt = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM));

$saltedPW =  $escapedPW . $salt;

$hashedPW = hash('sha256', $saltedPW);

$query = "insert into user (name, password, salt) values ('$escapedName', '$hashedPW', '$salt'); ";

然后在登录时它看起来像这样:

$escapedName = mysql_real_escape_string($_POST['name']);
$escapedPW = mysql_real_escape_string($_POST['password']);

$saltQuery = "select salt from user where name = '$escapedName';";
$result = mysql_query($saltQuery);
# you'll want some error handling in production code :)
# see http://php.net/manual/en/function.mysql-query.php Example #2 for the general error handling template
$row = mysql_fetch_assoc($result);
$salt = $row['salt'];

$saltedPW =  $escapedPW . $salt;

$hashedPW = hash('sha256', $saltedPW);

$query = "select * from user where name = '$escapedName' and password = '$hashedPW'; ";

# if nonzero query return then successful login

答案 1 :(得分:9)

你必须在密码密码方面推理:

当bob注册到您的应用时,

将密码存储为md5('bob123');

$query = "INSERT INTO users (username,password) VALUES('bob','".md5('bob123')."');

然后,当bob登录时:

$query = "SELECT * FROM users WHERE username = 'bob' AND password = '".md5('bob123')."';

obvioulsy使用变量用于用户名和密码,这些查询是由php生成的,然后你可以在mysql上执行它们

答案 2 :(得分:7)

请不要使用MD5进行密码散列。这些密码可以在几毫秒内破解。你肯定会受到网络犯罪分子的抨击。

PHP基于可靠的随机盐和多轮Rijndael / AES加密提供high-quality and future proof password hashing subsystem

当用户首次提供密码时,您可以将其哈希,如下所示:

 $pass = 'whatever the user typed in';
 $hashed_password = password_hash( "secret pass phrase", PASSWORD_DEFAULT );

然后,将$hashed_password存储在MySQL的varchar(255)列中。稍后,当用户想要登录时,您可以从MySQL检索散列密码,并将其与用户提供登录的密码进行比较。

 $pass = 'whatever the user typed in';
 $hashed_password = 'what you retrieved from MySQL for this user';
 if ( password_verify ( $pass , $hashed_password )) {
    /* future proof the password */
    if ( password_needs_rehash($hashed_password , PASSWORD_DEFAULT)) {
       /* recreate the hash */
       $rehashed_password = password_hash($pass, PASSWORD_DEFAULT );
       /* store the rehashed password in MySQL */
     }
     /* password verified, let the user in */
 }
 else {
     /* password not verified, tell the intruder to get lost */
 }

这种面向未来的工作原理如何? PHP的未来版本将适应更快,更容易破解加密的匹配。如果需要重新密码以使密码更难破解,password_needs_rehash()函数的未来实现将检测到密码。

不要重新发明瘪胎。使用专业设计和审查的开源代码来保证安全。

答案 3 :(得分:5)

插入:

INSERT INTO ... VALUES ('bob', MD5('bobspassword'));

检索:

SELECT ... FROM ... WHERE ... AND password=md5('hopefullybobspassword');

你是如何直接在查询中完成的。但是,如果您的MySQL启用了查询日志记录,则密码的明文将写入此日志。所以...你想在你的脚本中进行MD5转换,然后将生成的哈希插入到查询中。

答案 4 :(得分:3)

PHP有一个名为md5的方法;-)只需$ password = md5($ passToEncrypt);

如果您正在搜索SQL,您也可以使用MySQL方法MD5()....

 SELECT * FROM user WHERE Password='. md5($password) .'

或      SELECT * FROM ser WHERE Password = MD5('。$ password。')

要插入它,你可以用同样的方式。

答案 5 :(得分:3)

为什么不使用MySQL内置的密码hasher:

http://dev.mysql.com/doc/refman/5.1/en/password-hashing.html

mysql> SELECT PASSWORD('mypass');
+-------------------------------------------+
| PASSWORD('mypass')                        |
+-------------------------------------------+
| *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |
+-------------------------------------------+

为了比较你可以这样:

select id from PassworTable where Userid='<userid>' and Password=PASSWORD('<password>')

如果它返回一个值,那么用户是正确的。

答案 6 :(得分:2)

我对PHP并不陌生,但我认为这就是你所做的:

$ password = md5($ password)

$password将是$_POST['password']或其他

答案 7 :(得分:0)

只需通过以下行获取哈希并将其存储到数据库中:

$encryptedValue = md5("YOUR STRING");

答案 8 :(得分:0)

为了进一步提高安全性,您可以使用md5加密以及两个不同的salt字符串,一个在php文件中定义的静态salt,然后为每个密码记录添加一个随机生成的唯一salt。

以下是生成salt,md5字符串和存储的方法:

    $unique_salt_string = hash('md5', microtime()); 
    $password = hash('md5', $_POST['password'].'static_salt'.$unique_salt_string);
    $query = "INSERT INTO users (username,password,salt) VALUES('bob','".$password."', '".$unique_salt_string."');

现在您有一个静态salt,它对所有密码都有效,存储在.php文件中。然后,在注册执行时,您将为该特定密码生成唯一的哈希值。

这一切最终都是:两个拼写完全相同的密码,将有两个不同的哈希值。唯一哈希与当前id一起存储在数据库中。如果有人抓住数据库,他们将为每个特定密码提供每一个独特的盐。但他们没有的是你的静态盐,这使得每个“黑客”的事情变得更加困难。

这是您在login.php上检查密码有效性的方法,例如:

     $user = //username input;
     $db_query = mysql_query("SELECT salt FROM users WHERE username='$user'");
     while($salt = mysql_fetch_array($db_query)) {
            $password = hash('md5',$_POST['userpassword'].'static_salt'.$salt[salt]);
}

此方法非常强大且安全。如果你想使用sha512加密,只需将它放在哈希函数中而不是上面代码中的md5。