码农家园

关闭
导航

关于php:如何将我的登录脚本中的安全性从MD5更新为更安全的?


hashloginpassword-hashphpsecurity

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之类的。

相关讨论

  • 1。使用现有的身份验证库2。使用现有身份验证..有多个问题在so上是致命的-搜索"php hash password"并具有良好的可读性:SQL注入;不适当的hash选择(sha-1也不合适);没有salt(尽管声明了什么);其他问题。?
  • 我读到MD5已经很糟糕了,Sha256和Salt被重新推荐了,但是我要看看你发的东西,做一些研究。谢谢您指正方向,先生。
  • MD5不应该用于密码散列;但为什么不应用于SHA-1的原因完全相同。MD5散列仍然不可能是可行的"未散列"—但是,MD5和SHA-1都容易受到暴力强迫,因为它们都非常快速,并且可以并行。使用salt可以防止彩虹表攻击(由于彩虹表攻击,不使用salt是一个毫无价值的哈希密码),但它不能防止蛮力攻击,这就是为什么sha-1不比md5更适合此特定任务的原因。
  • 我喜欢这个关于密码"做"和"不做"的答案。请注意,所有推荐的密码散列(scrypt、bcrypt、pbkdf)策略都是为缓解暴力攻击而设计的。虽然可以"循环sha-1 10000次",但这个特殊的哈希问题已经得到了解决——以更好的方式。另外,不要忘记盐。
  • 然而,与所有系统一样,只有最薄弱的环节需要被破坏——暴力强制要求访问哈希密码,这已经意味着至少有一个对数据存储的读访问妥协。在本例中,我实际上怀疑系统可能会通过SQL注入而受到损害;但这需要查看更大的上下文。(另外,不要忘记使用HTTPS连接和防止XSS的重要性,否则有人可能会以明文获取密码,这是微不足道的。)
  • 密码存储在一个数据库中,没有明文,而且我有一个适当的代码片段来防止SQL注入,我只需要对密码安全性做更多的阅读。
  • 我推荐PDO或MySQLI和占位符-它们更整洁和有保证。除非你的"正确片段"是mysql_real_escape_string,否则最好是可疑的。
  • 看到我在读从新手到忍者的php和mysql,我在学习pdo,对吧?这就是我得到mysql_real_escape_字符串来防止SQL注入的地方。
  • 虽然mysql_real_escape_string会起作用(而且它比其他各种"消毒"的化身要好得多),但不应鼓励使用它来支持占位符。占位符有多种优点:1.不需要确保每个地方都有mysql_real_escape_string,因为占位符将"只是工作"以防止SQL注入;2。不需要在查询中包含引号,它还可以生成一个更简单的查询,且字符串插值噪声更小;3.无需特殊情况下的空处理或与字符串/数字的差异。
  • 看起来我有一些阅读要做,再次感谢用户!


简短回答

使用bcrypt而不是md5或sha1。

更长的答案

使用crypt()很困难。在php 5.5版中有一个新的php密码散列API,您可以在这里阅读:

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

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

https://github.com/ircmaxell/passwordu兼容

编辑:查看此线程,了解关于该主题的更全面的答案:

如何使用bcrypt在PHP中散列密码?

相关讨论

  • 所以我可以用bcrypt交换MD5,它应该自己适应?
  • @不,你不能交换它。阅读上面链接到的crypt()上的php文档。阅读我刚刚添加了一个链接的so线程,它有很多示例代码。
  • 喜欢阅读新密码哈希API的RFC。
  • @DannyBeckett,这确实是一个相当好的链接,很快就能找到使密码散列适合的方法。


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

如果您现在有一个MD5哈希,那么您可能只有"bac232bc1334de"或其他东西。

当你去沙或其他地方时,你应该把它改为:"沙:你的沙。

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

因为您在登录时获得了原始密码,所以可以动态地将您的密码作为人员登录进行升级。

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

而且,似乎你没有改变你的密码。你必须修改密码,这样当玛丽苏用"ilovekittens"作为密码,而大杰克马奥尼用"ilovekittens"作为密码时,你不会得到相同的密码。

您也可以将salt存储在密码中:"sha:randomsaltcharacters:yoursaltedhashhere"。

强烈建议加盐。不加保险的话,你用什么方案也没什么关系。

相关讨论

  • 在MD5上使用sha-1进行密码散列几乎没有好处。在任何情况下都应使用一个好的盐值(或等效值),否则由于彩虹表和时间/空间权衡,散列是无用的-因此我会说"需要盐处理"。


尝试使用以下类:

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
PassHash::hash("test");

并检查:

1
2
3
 if (PassHash::check_password($databasepassword, $formpassword)){
  // do stuff
 }

此函数使用Blowfish加密。有关河豚的更多信息,请转到php.net/crypt

河豚被认为是加密密码最有效也是最有力的方法。不要在不使用盐的情况下使用MD5或SHA1!

相关讨论

  • 不要使用MD5或SHA1(用于此项)!
  • 不过,我同意。对于看起来安全的小型系统,您可以使用MD5和SALT。只要你保持盐远离你的httpd dir。否则我还是不明白为什么你不应该使用MD5。因为它是不可逆的…
  • MD5和SHA1都不适合(含盐或不含盐),因为它们可以被野蛮强迫。请看我在主贴上的评论。我完全同意使用bcrypt(如图所示),因为它可以抵抗蛮力攻击。(这个答案也显示了良好的产盐功能。)


  • 如何使用bcrypt在PHP中散列密码?
  • 关于MySQL:如何在PHP中防止SQL注入?
  • 关于安全:PHP密码的安全哈希和salt
  • 关于php:如何从youtube api获取youtube视频缩略图?

Copyright ©  码农家园 联系:[email protected]