【问题标题】:Is there any point in storing am md5-encrypted password in PHP?在 PHP 中存储 am md5 加密的密码有什么意义吗?
【发布时间】:2015-05-28 11:14:44
【问题描述】:

我根本不是真正的 PHP 程序员,主要做 javascript/design,但我正在修改一些别人制作的 PHP 代码,我想知道以下几点:

将基本登录密码存储在 md5() 中的 config.php 文件中,如下所示有什么意义吗?

define("USERNAME", "username");
define("PASSWORD", md5("password"));

我可以理解该常量将被加密存储,当它与登录尝试相比时,它会是这样的:

if(PASSWORD == md5($_SERVER['PHP_AUTH_PW'])) ...

但是,我很难看到在这种情况下使用加密有什么好处,因为它不发送加密数据,而只是使用它来比较登录尝试。如果我错了,谁能告诉我?

【问题讨论】:

  • 唯一的问题是,现在如果您回显$_SERVER['PHP_AUTH_PW'] ,您将无法读取确切的密码
  • md5() 不是加密函数。你使用md5() 来散列一个字符串。
  • 你是对的。可以读取配置文件的入侵者现在知道密码。最好将md5("password") 的结果存储为define("PASSWORD", "5f4d...");。但即便如此,password_hash() 将是更好的选择
  • @Szenis - $_SERVER['PHP_AUTH_PW'] 仍然包含明文密码,即使经过比较
  • @MarkBaker a ya of course 但定义的密码没有

标签: php login md5


【解决方案1】:

只要密码泄露了原始密码,你就什么都得不到。

如果您只在脚本中存储哈希值,那么有权访问代码的人将看不到原始密码,因此无法登录。

define("PASSWORD", 'db21e1fe1bf92b66ef2363d3c76c62d5');

if (PASSWORD = MD5($_SERVER['PHP_AUTH_PW']))

MD5 不是一个很好的哈希密码选择,你应该使用预先计算的 BCrypt 值,你可以调用函数password_hash() 来计算它。

define("PASSWORD", '$2y$10$nOUIs5kJ7naTuTFkBy1veuK0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa');

if (password_verify($_SERVER['PHP_AUTH_PW'], PASSWORD))

【讨论】:

  • 感谢您的澄清。对于可以访问配置 PHP 文件的单用户来说,这只是一个超级基本的登录方案,使用 md5() 假装它增加了某种安全性似乎有点“愚蠢”。
【解决方案2】:

如果只有一个用户,并且他/她的凭据存储在 php 脚本中,那么是的,根本没有理由调用 md5()。 除了一种特殊情况,当您出于某种原因可以在公共可访问页面上执行 var_dump(PASSWORD) 时。 但无论如何,这从一开始就是一个错误的架构。

【讨论】:

    【解决方案3】:

    md5 是一种加密方法。它将普通密码加密并以加密形式存储在数据库中。以免任何人滥用它。是的,在比较登录时,我们两边都需要 md5。插入的密码必须是 md5。如果 md5 密码存储在数据库中。 希望你明白其中的逻辑。

    【讨论】:

    • 这是一个哈希,而不是一种加密方法。哈希只是一种方式:)
    【解决方案4】:

    我们使用哈希来保护应用程序免受可能的漏洞(例如文件下载漏洞)的影响,即使您的网络应用程序是安全的并且您使用的是共享主机,他们可以使用符号来查看 php 源文件。

    如果您的密码经过哈希处理(md5 ...等),他会在此时查看您的密码,他将尝试破解它(破解 = 暴力破解哈希)或检查哈希数据库。

    仅当您使用大字符串且不使用在线哈希工具(他们会将您的哈希和字符串出售给哈希数据库)时,您的哈希才会受到保护(任何哈希类型)。

    不推荐使用md5,因为它很受欢迎。

    没有意义

    define("PASSWORD", md5("password"));
    if(PASSWORD == md5($_SERVER['PHP_AUTH_PW'])){ echo 'validpass'; }
    

    就像你在告诉攻击者“嘿,我的密码是 PASSWORD 常量”

    你应该在 php 中手动散列密码

    <?php   
    echo md5('YourPassHere').PHP_EOL; 
    //a9903eab80299592904956c9f966f4c1 == YourPassHere 
    ?> 
    

    复制哈希并将其放入(当然你不必使用 md5(); 因为你已经对密码进行了哈希处理)

    define("PASSWORD", "a9903eab80299592904956c9f966f4c1");
    

    然后离开

    if(PASSWORD == md5($_SERVER['PHP_AUTH_PW'])) { print 'valid pass';}
    

    【讨论】:

      猜你喜欢
      • 2012-09-03
      • 2018-07-09
      • 2012-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-19
      • 2011-05-24
      相关资源
      最近更新 更多