【问题标题】:How do you generate a security string in PHP?如何在 PHP 中生成安全字符串?
【发布时间】:2011-10-16 22:00:39
【问题描述】:

我正在为我的网站构建一个登录系统,但是我之前一直使用 $_SESSION 变量来记住登录的人,但这次需要通过 cookie 来记住他们。 cookie 将存储他们的用户名和安全代码,我还将它们存储在数据库中,以便我确认他们是正确的用户。我已经看到了各种方法,但是我想生成一个完全安全的字符串。

【问题讨论】:

  • 安全对您意味着什么?如果您当前的方法有问题怎么办?将哈希值保存为键对我来说似乎很好。
  • 如果您担心有人破解您的数据库并盗用所有密码,方法是: 1. 为每个用户生成一个盐(随机字符串); 2. 多次散列盐 + 密码(足以花费一秒钟的时间)。不幸的是,您真正担心的是有人窃听并获取了识别字符串。为此,您需要 TLS。
  • 我已经在使用 MD5 对密码进行加密,但是我不希望在 cookie 中看到加密版本(密码)。是否可以在 PHP 中生成一个短(6 个字符)随机字符串,MD5 它,然后在 cookie 中使用它?
  • 顺便说一句,这是非常好的阅读 -> programmers.stackexchange.com/questions/51403/…

标签: php


【解决方案1】:

$_SESSION 默认已经使用 cookie,因此您无需更改任何内容。只需确保 use_cookiesuse_only_cookies 配置选项设置为开启即可。

【讨论】:

    【解决方案2】:

    秘密通常是一个随机数,您可以计算它的 md5 并将其放入 cookie 中,这就是我为我的一个应用程序执行此操作的方式($salt 是一个唯一的大任意字符串):

    $rnd = mt_rand( 0, 0x7fffffff ) ^ crc32( $salt ) ^ crc32( microtime() );
    
    $secret = md5( $rnd );
    

    如果您想在每次创建 $rnd 时将其保存在某处(可能在 DB 中)并按其值移动您的下一个 $rnd 并将下一个 $rnd 保存在 DB 中,使其更加安全...

    【讨论】:

    • 未修改的 Mersenne-Twister 为 not cryptographically secure;因此不应用于加密应用程序,例如会话 ID 生成。此外,getMicroTime 应使用return microtime(true); 实现。另外,MD5 是severely compromised。幸运的是,所有这些问题在很大程度上都是理论上的。你的算法对除了最足智多谋的攻击者之外的所有攻击者都是安全的(2011 年)。
    • 你说得对,我的 getMicrotime() 对于这个应用程序来说太多了,我只是从我现有的代码中复制了它。我编辑并删除了它。顺便说一句,如果您使用旧的 $rnd 转移新的 $rnd,我无法从链接中得到为什么我的代码不安全。
    • mt_rand的下一个输出理论上可以在看到足够多的输出后预测。由于理论上所有其他随机性来源都很容易猜测,这使得整个算法在理论上不安全。
    • MD5 被攻破不会使这段代码不安全,如果攻击者可以侵入 $secret 他得到的是对他没有用的 $rnd。同样通过 $salt 和 microtime() 移动值使得预测 mt_rand() 结果几乎是不可能的。无论如何,我认为这段代码对于大多数应用程序来说已经足够安全了。
    • 计算 MD5 哈希的倒数确实是不可行的,但你为什么要首先使用 MD5 而不是 SHA-2?是的,你是对的,这段代码可以抵抗 2011 年以来的任何公开攻击。
    【解决方案3】:

    我使用 ASCII code 和函数 chr,从字符 33 到 126。

    函数是这样的:

    $seed = "";
    for ($i = 1; $i <= 20; $i++) {
        $seed .= chr( mt_rand(33,126) );
    }
    return md5($seed);
    

    【讨论】:

      【解决方案4】:

      您可以按照here 的建议制作加密安全随机字符串

      在这里您生成一个包含 (A-Z) 和 (0-9) 的 32 字符长字符串

      $token = bin2hex(openssl_random_pseudo_bytes(16));
      
      # or in php7
      $token = bin2hex(random_bytes(16));
      

      【讨论】:

        猜你喜欢
        • 2010-10-26
        • 1970-01-01
        • 2015-11-07
        • 2012-02-12
        • 1970-01-01
        • 2011-10-30
        • 2012-08-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多