如何在mysql中创建和存储md5密码
问题的原因是在MySQL中创建和存储md5密码。解决方法是在密码中加入盐值以增加安全性。
在注册应用程序时,将密码存储为md5哈希值。例如,当bob注册时,将密码存储为md5('bob123');
。
在登录时,通过查询数据库来验证密码是否匹配。例如,使用以下查询语句:$query = "SELECT * FROM users WHERE username = 'bob' AND password = '".md5('bob123')."';
为了增加安全性,可以在密码中添加盐值。例如,$salt="1qTR3"; ... md5('bob123'.$salt)...
。这样做可以增加破解数据库中所有密码的难度。
以上解决方法可以通过PHP生成查询语句,并在MySQL中执行。
问题的原因:不建议使用MD5对密码进行哈希处理,因为这样的密码可以在几毫秒内被破解,容易被黑客攻击。
解决方法:PHP提供了一个高质量且未来可靠的密码哈希子系统,基于可靠的随机盐和多轮Rijndael / AES加密。当用户首次提供密码时,可以使用以下方法进行哈希处理:
$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 )) { /* 未来保护密码 */ if ( password_needs_rehash($hashed_password , PASSWORD_DEFAULT)) { /* 重新创建哈希 */ $rehashed_password = password_hash($pass, PASSWORD_DEFAULT ); /* 将重新哈希的密码存储在MySQL中 */ } /* 密码验证通过,允许用户登录 */ } else { /* 密码验证失败,告诉入侵者离开 */ }
这种未来保护是如何工作的?PHP的未来版本将适应更快且更容易破解的加密方式。如果需要重新哈希密码以增强其安全性,未来的`password_needs_rehash()`函数将检测到。
不要重复发明轮子。使用经过专业设计和审核的开源代码来保证安全性。
问题的原因是,MD5不是最好的哈希方法,建议使用sha256或sha512。解决方法是使用hash('sha256')来代替md5()进行哈希处理。在创建用户名和密码时,将原始密码与一些盐进行哈希处理,盐是为了增加密码长度和强度而添加到每个密码中的一些随机额外字符。在登录时,通过查询数据库中的盐值来验证密码。此外,为了增加密码的安全性,建议为每个密码使用唯一的盐。代码如下:
创建用户时的代码:
$escapedName = mysql_real_escape_string($_POST['name']); $escapedPW = mysql_real_escape_string($_POST['password']); $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); $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';";
另外,还提到了在哈希之前对密码进行转义的原因是为了防止注入攻击。还有一个关于如何执行查询字符串和解析结果的问题,建议参考php.net上的相关文档。最后,提到了随着时间的推移和计算机的进步,需要更新密码哈希方法,提供了相关的文档链接。