5

我在数据库上有一个带盐的 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 什么的。

4

3 回答 3

3

简短的回答

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 对密码进行哈希处理?

于 2013-05-01T23:13:44.347 回答
1

考虑到@jszbody 帖子,您还应该更新密码字段以告诉您想要使用的方案。

你现在有一个 MD5 哈希,你可能只有“BAC232BC1334DE”或其他东西。

当你去 SHA 或其他什么时,你应该把它改成:“SHA:YOURSHAHASHHERE”。

因为您现在无法更改任何现有密码。这将使其更加向后兼容,因为现在您可以支持这两种方案。

由于您在登录期间获得了原始密码,因此您可以在人们登录时动态升级您的密码。

你得到你的用户记录,检查密码。如果没有scheme,使用MD5,比较密码。如果他们正确(即他们可以登录),您可以将他们的旧 MD5 密码更新为新的 SHA 密码。

此外,您似乎没有加盐密码。你必须给你的密码加盐,这样当 Mary Sue 使用“ilovekittens”作为她的密码,而 Big Jake Mahoney 使用“ilovekittens”作为他的密码时,你不会得到相同的密码。

您也可以将盐存储在密码中:“SHA:RANDOMSALTCHARACTERS:YOURSALTEDHASHHERE”。

强烈推荐腌制。不加盐的,你使用什么方案并不重要。

于 2013-05-01T23:40:43.023 回答
0

尝试使用以下类:

<?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!

于 2013-05-01T23:43:45.117 回答