我如何更新我的安全在我的登录脚本从MD5到更安全的东西


How do I update my security in my login script from MD5 to something more secure?

我有一个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而不是md5sha1

长回答

crypt()使用困难。在PHP 5.5版本中有一个新的PHP密码哈希API,你可以在这里阅读它:

https://gist.github.com/nikic/3707231

它使用bcrypt,使整个过程非常容易。当然php 5.5还没有准备好,所以现在有一个库来提供这个新的API:

https://github.com/ircmaxell/password_compat

编辑:查看这个主题的更全面的答案:

如何在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 !