我有一个PHP登录脚本与盐的数据库,但在我的注册脚本我看到:
$qry = "INSERT INTO accounts(username, firstname, lastname, password) " .
VALUES('$username','$fname','$lname','" . md5($_POST['password']) . "')";
和登录:
$qry="SELECT * FROM accounts WHERE username='$username' AND password='" .
md5($_POST['password']) . "'";
是否有一些代码可以取代MD5?更安全的东西?
我听说过SHA1之类的
简短回答
使用bcrypt
而不是md5
或sha1
长回答
crypt()
使用困难。在PHP 5.5版本中有一个新的PHP密码哈希API,你可以在这里阅读它:
它使用bcrypt
,使整个过程非常容易。当然php 5.5还没有准备好,所以现在有一个库来提供这个新的API:
编辑:查看这个主题的更全面的答案:
如何在PHP中使用bcrypt对密码进行哈希?
考虑到@jszbody帖子,您还应该更新您的密码字段,以告诉您正在使用的方案。
你现在有一个MD5哈希值,你可能只是"BAC232BC1334DE"或其他东西。
当你使用SHA或其他方式时,你应该将其更改为:"SHA:YOURSHAHASHHERE"。
因为你现在不能更改任何现有的密码。这将使它更加向后兼容,因为现在您可以支持两种模式。
由于您在登录时获得原始密码,因此您可以在人们登录时动态地升级您的密码。
你得到你的用户记录,检查密码。如果没有方案,使用MD5,比较密码。如果他们是正确的(即他们可以登录),你可以将他们的旧MD5密码更新为新的SHA密码。
而且,你似乎没有给你的密码加盐。你必须给你的密码加盐,这样当Mary Sue用"ilovekittens"作为她的密码,而Big Jake Mahoney用"ilove小猫"作为他的密码时,你不会得到相同的密码。
您也可以在密码中存储盐:"SHA:RANDOMSALTCHARACTERS:YOURSALTEDHASHHERE"。
强烈建议用盐腌制。不加盐的话,你用什么方案都没什么关系。
尝试使用以下类:
<?php
class PassHash {
// blowfish
private static $algo = '$2a';
// cost parameter
private static $cost = '$31';
// mainly for internal use
public static function unique_salt() {
return substr(sha1(mt_rand()),0,22);
}
// this will be used to generate a hash
public static function hash($password) {
return crypt($password,
self::$algo .
self::$cost .
'$' . self::unique_salt());
}
// this will be used to compare a password against a hash
public static function check_password($hash, $password) {
$full_salt = substr($hash, 0, 29);
$new_hash = crypt($password, $full_salt);
return ($hash == $new_hash);
}
}
?>
在你的页面中加入以下内容:
include_once('passhash.class.php');
对密码进行散列:
PassHash::hash("test");
和检查:
if (PassHash::check_password($databasepassword, $formpassword)){
// do stuff
}
此函数使用Blowfish加密。有关Blowfish的更多信息,请访问PHP.net/crypt
Blowfish被认为是最有效也是最强大的密码加密方式。不要在不使用盐的情况下使用MD5或SHA1 !