【问题标题】:What's the best way to secure a query string with Java?使用 Java 保护查询字符串的最佳方法是什么?
【发布时间】:2009-03-04 19:40:42
【问题描述】:

当用户在我们的 Struts 应用程序中注册时,我们希望向他们发送一封电子邮件,其中包含指向不同页面的链接。链接需要在其查询字符串中包含一个唯一标识符,以便目标页面可以识别用户并做出相应的反应。

为了提高这个系统的安全性,我想首先加密包含标识符的查询字符串,然后将链接设置为过期——在它被使用后和/或几天后。

您会建议我使用哪些 Java 技术/方法来执行此操作?

【问题讨论】:

    标签: java security url encryption


    【解决方案1】:

    我将对您的担忧做出一些假设:

    1. 一个用户不能猜测另一个用户的 URL。
    2. 一旦使用,URL 就不能重复使用(避免会话重放攻击。)
    3. 无论是否使用,URL 都不应永远存在,从而避免暴力探测。

    这就是我的做法。

    • 将用户 ID 和过期时间戳保存在一个表中。
    • 将它们连接成一个字符串,然后从中生成一个 SHA-1 哈希。
    • 使用 SHA-1 哈希值生成 URL。将所有此类 URL 映射到将进行验证的 servlet。
    • 当有人向您发送带有哈希的页面请求时,使用它来查找用户和过期时间。
    • 在用户完成着陆页应该做的任何事情后,将数据库中的行标记为“已使用”。
    • 每天运行一项作业,以清除已使用或已过期的行。

    【讨论】:

    • 这是一个好方法。但是,我只会选择一个随机的 128 位标识符,而不是散列。它更简单,同样安全,甚至更安全。
    • 我同意。不需要哈希。如果它是随机的,那么对密钥进行逆向工程的唯一方法是通过数据库表。
    • 好点m erickson & bonjollity。我想我只是使用了反射的哈希值。
    【解决方案2】:

    对于第一部分,请查看Generating Private, Unique, Secure URLs。对于到期,您只需将唯一的密钥创建时间戳存储在数据库中,并且只允许您的操作在例如​​ now-keyCreatedAtQuartz 作业定期删除那些评估为“now-keyCreatedAt

    【讨论】:

      【解决方案3】:

      我认为您可以以无状态方式执行此操作,即没有其他人建议的数据库表。

      • 按照 mtnygard 的建议,对 URL 参数和一个秘密盐字符串进行 SHA-1 哈希处理。
      • 将哈希值添加为 URL 上的必需参数。
      • 在电子邮件中发送 URL。

      当用户点击网址时:

      • 通过再次计算哈希值并将计算值与 URL 上的值进行比较来验证 URL 的完整性。

      只要你不泄露你的秘密盐串,就没有人能够伪造对系统的请求。但是,与其他提案不同,此提案不会阻止重播旧 URL。这可能是可取的,也可能不是可取的,具体取决于您的情况。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-24
        • 2020-09-26
        • 2012-03-04
        • 2021-04-10
        • 1970-01-01
        • 2023-03-16
        • 2019-03-02
        • 2012-05-31
        相关资源
        最近更新 更多