【问题标题】:How to encode/encrypt secret data to be transferred by URL parameters?如何编码/加密要通过 URL 参数传输的秘密数据?
【发布时间】:2014-01-24 00:17:51
【问题描述】:

故事是这样的:

我必须将一些机密信息从一个脚本传递到另一个脚本。在第一个脚本中,我需要先加密数据,然后我必须将加密数据附加到 GET 请求中并将其发送到另一个脚本。 URL 如下所示:

http://mydomain.com/mysecondscript.php?secret={encrypted stuff}

我目前的加密方法是基于base64的。这种方法的问题是,如果我有很多东西要加密,加密的结果可能会很长。如果超过 255 个字符左右,第二个脚本将无法解密,因为字符串会被截断。

所以我正在寻找一种更好的加密方法,可以控制加密结果的长度。

【问题讨论】:

  • 您是否可以使用 POST 请求,而不会被烦人的 ~255 字符限制所抑制?
  • AFAIK GET 受限于 URL 大小,这取决于浏览器。 IE 最多支持 2048 字节的 URL,其他浏览器有很多,much bigger limits
  • 相关答案及完整解决方案:stackoverflow.com/questions/9465369/…

标签: php encryption


【解决方案1】:

危险!

Base64 不是一种加密形式,而是编码。 Base64 编码的字符串易于识别且易于解码。 Base64 用于对数据进行编码,以便它们可以通过非二进制安全介质(例如 URL 和电子邮件)安全地传输,但它们不会隐藏数据本身。

您需要做的是使用 AES 加密字符串(请参阅 PHP 的 mcrypt),然后对其进行 base64 编码。这当然不会解决您的长度问题。这个问题很模糊,但你可以做的是:

  • 使用 POST 而不是 GET。
  • 将数据存储在两个脚本都可以访问的数据库或文件中。然后只需生成一种标识符并将其与 URL 一起发送。接收脚本可以使用此标识符来检索数据。另外,您不必使用 URL 发送分类数据。

编辑: 现在我更仔细地阅读了您的问题,似乎两个脚本都位于同一台服务器上。在这种情况下,没有任何理由通过 HTTP 传递这些数据。

【讨论】:

  • "在这种情况下,没有任何理由通过 HTTP 传递这些数据" .. 为什么你认为没有理由通过 HTTP 传递这些数据,然后呢?你在提议??您能否澄清一下,您的意思是存储数据库还是在文件中,然后两个应用程序都从那里检索?在这种情况下,我看到了一个额外的网络调用..
  • @hagrawal 如果两个脚本都在同一台服务器上运行,那么您没有理由使用 HTTP 发送敏感数据
  • 这就是问题所在,为什么?你提议的替代方案是什么?
  • 如果两个脚本都在同一台服务器上,您所要做的就是让一个脚本告诉另一个 在哪里 找到该数据(但不是数据本身)。您可以将这些数据保存在文件或数据库中;没关系。所有一个脚本都必须告诉另一个脚本是某种 ID(例如,数据库中的主键),第二个脚本可以根据该 ID 找到它。是的,仍然有一些东西通过网络,但没有敏感数据暴露给外界。
【解决方案2】:

无论您的加密方案多么安全,您仍然需要对结果进行 base64 或 URL 编码,您发现结果可能会超过 255 个字符。你能做的最好的就是压缩数据,然后加密,然后编码。它仍然可能会失败。您需要找到 GET 的替代方法。

【讨论】:

    【解决方案3】:

    为什么必须在 URL 中传输它?将其保存到磁盘,放入数据库,将其添加到消息传递队列...

    您可以在 URL 中使用不透明的令牌来识别您正在谈论的内容,然后通过查询您选择的任何存储机制将该令牌转换回另一端有用的东西。

    【讨论】:

    • 是的,这可以解决。我需要通过 GET 请求实际解决这个问题。
    • @Shawn:你有机会改用 POST 吗?我之前在 POST 中传递了一些体面长度的参数,所以它可能会起作用(我不知道最大尺寸是否有明显差异)。 GET 和 POST 非常相似,可能很容易切换。
    • @Shawn,将其暴露给用户只是自找麻烦。如果您有能力仅在后端存储此信息, 这样做。从长远来看,它会让您的生活更轻松。
    【解决方案4】:

    如果这是敏感信息,则不应使用 base64,因为它很容易被解码。如果您希望信息被安全加密,您应该使用 PHP Mcrypt (link)。更安全,可以支持更长的字符串加密。最重要的是,您设置了自己的密钥,没有该密钥就无法解密。它需要更多的工作,但它会是安全的。此外,如果您以这种方式传递多个变量,则可以将它们设置为数组,序列化和加密数组,通过 GET 传递数组,然后解密/反序列化。就这么简单。最后一件事,还有一些类可以让 Mcrypt 更容易使用。可能想谷歌找到一个,它会让你的生活更轻松。

    【讨论】:

      【解决方案5】:

      您可以使用 MD5 创建 id 的哈希值,这样您就可以得到类似的结果:

      http://www.demo.com/displaycommittees.php?id=81dc9bdb52d04dc20036dbd8313ed055

      在您的数据库查询中,您可以对用户表进行选择,包括一个 WHERE 语句,该语句还散列 id 列,例如:

      哪里 MD5(id) = $_GET[id]

      这很好用,我一直应用这个算法。例如假设加密 id 23 的实际值,如果您尝试将 23 代替加密(哈希)代码,它将不起作用(不会有任何结果展示)。

      注意:原因对于那些需要解决方案的人来说是最清楚的,因此“为什么”的问题可能不会出现在需要解决方案的人身上。他们只要求一个解决方案,如果它对他们有用,很好。但是对于交易应用(例如现金交易或交易密码)请避免通过 URL 传递敏感信息,因为它很容易被破解。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-17
        • 2014-07-19
        • 2012-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-16
        • 2013-11-29
        相关资源
        最近更新 更多