How do I update my security in my login script from MD5 to something more secure?
我在数据库中有一个带有salt的PHP登录脚本,但在我的注册脚本中,我看到了:
1 2 | $qry ="INSERT INTO accounts(username, firstname, lastname, password)" . VALUES('$username','$fname','$lname','" . md5($_POST['password']) ."')"; |
对于登录:
1 2 | $qry="SELECT * FROM accounts WHERE username='$username' AND password='" . md5($_POST['password']) ."'"; |
是否有一些代码可以替换MD5?更安全的东西?
我听说过Sha1之类的。
简短回答
使用
更长的答案
使用
https://gist.github.com/nikic/3707231
它使用
https://github.com/ircmaxell/passwordu兼容
编辑:查看此线程,了解关于该主题的更全面的答案:
如何使用bcrypt在PHP中散列密码?
考虑到@jszbody post,您还应该更新密码字段,告诉您想要使用的方案。
如果您现在有一个MD5哈希,那么您可能只有"bac232bc1334de"或其他东西。
当你去沙或其他地方时,你应该把它改为:"沙:你的沙。
因为您现在不能更改任何现有密码。这将使它更向后兼容,因为现在您可以支持这两种方案。
因为您在登录时获得了原始密码,所以可以动态地将您的密码作为人员登录进行升级。
你得到你的用户记录,检查密码。如果没有方案,请使用MD5并比较密码。如果他们是正确的(即他们可以登录),您可以将他们的旧MD5密码更新为新的SHA密码。
而且,似乎你没有改变你的密码。你必须修改密码,这样当玛丽苏用"ilovekittens"作为密码,而大杰克马奥尼用"ilovekittens"作为密码时,你不会得到相同的密码。
您也可以将salt存储在密码中:"sha:randomsaltcharacters:yoursaltedhashhere"。
强烈建议加盐。不加保险的话,你用什么方案也没什么关系。
尝试使用以下类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | <?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); } } ?> |
在页面中包含以下内容:
1 | include_once('passhash.class.php'); |
密码散列方式:
1 |
并检查:
1 2 3 | if (PassHash::check_password($databasepassword, $formpassword)){ // do stuff } |
此函数使用Blowfish加密。有关河豚的更多信息,请转到php.net/crypt
河豚被认为是加密密码最有效也是最有力的方法。不要在不使用盐的情况下使用MD5或SHA1!