【问题标题】:Adding a simple MAC to url parameters?将简单的 MAC 添加到 url 参数?
【发布时间】:2010-10-16 13:50:29
【问题描述】:

我想在我的一些 URL 参数中添加一种简单的 MAC。这旨在作为针对应用程序错误和缓存相关问题/错误的额外防线,而不是作为应用程序中实际登录安全性的任何形式的替代。给定的业务对象 ID 已受后端保护,仅限于单个用户。

所以基本上我想在我的 url 参数中添加一个简短的身份验证代码,大小为 2-4 个字符。我想我想要一个可逆函数,类似于 f(business-data-id + logged-on-user-id + ??) = hash,但我愿意接受建议。

主要目的是停止 id 猜测,并确保每个登录用户的 url 相当不同。我也想要像 MD5 这样又大又笨重的东西。

【问题讨论】:

    标签: security web-applications


    【解决方案1】:

    由于您不是在寻找加密质量,也许 24 位 CRC 可以满足您的需求。虽然 MD5 在绝对意义上是“快”的,但 CRC 相对而言是“快得惊人”。然后可以将 3 字节的 CRC 文本编码为使用 Base-64 编码的四个字符。

    这是用于 OpenPGP ASCII-armor 校验和的检查的 Java 实现:

    private static byte[] crc(byte[] data)
    {
      int crc = 0xB704CE;
      for (int octets = 0; octets < data.length; ++octets) {
        crc ^= (data[octets] & 0xFF) << 16;
        for (int i = 0; i < 8; ++i) {
          crc <<= 1;
          if ((crc & 0x1000000) != 0)
            crc ^= 0x1864CFB;
        }
      }
      byte[] b = new byte[3];
      for (int shift = 16, idx = 0; shift >= 0; shift -= 8) {
        b[idx++] = (byte) (crc >>> shift);
      }
      return b;
    }
    

    我会散列一个密钥(只有服务器知道),以及你想要保护的任何东西——可能是对象标识符和用户标识符的组合。

    【讨论】:

    • "Something" 与我昨天所做的完全一样,但我仍然想知道 32 位 crc 和 base64 编码。 CRC24 解决了 那个 一个 ;)
    【解决方案2】:

    如果您想要的基本上是 MD5 但更小,为什么不只使用 MD5 而只使用最后 4 个字符?这不会为您的网址添加一个巨大的 blob,它始终是 4 个漂亮的十六进制数字。

    【讨论】:

    • 由于没有其他答案,我也是这么想的。对计算大校验和只使用一小部分持怀疑态度,您认为计算开销可以吗?
    • 计算 MD5 相当便宜,但要对其进行基准测试以确保。我们曾经在一个紧密的循环中使用 MD5,因此我们进行了基准测试以确保并且可以达到每秒数千次 IIRC。
    【解决方案3】:

    我确信有一个很好的答案的快速问题,但为什么不将此信息存储在 cookie 中?

    然后你可以使用像 MD5 这样大而笨重的东西,你的 URL 仍然很漂亮。

    【讨论】:

    • 这适用于我从服务器发送到客户端的带有参数的 all url,所以会有很多。这将如何阻止合法用户进行身份猜测?
    • 对不起,我现在看到了。但我不确定 URL 参数上的访问代码会给您带来什么额外的好处。如果您在后端进行身份验证和访问控制,那么当用户尝试查看他们无权查看的资源时,您是否可以防止 ID 猜测“访问被拒绝”消息?
    • 针对缓存错误和类似问题的额外预防措施
    猜你喜欢
    • 1970-01-01
    • 2011-08-09
    • 2015-04-24
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多