使用Java保护查询字符串的最佳方法是什么?

时间:2009-03-04 19:40:42

标签: java security url encryption

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

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

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

3 个答案:

答案 0 :(得分:4)

我将对你的担忧作出一些假设:

  1. 用户不应该猜到其他用户的网址。
  2. 使用后,URL不应重复使用(避免会话重放攻击。)
  3. 无论是否使用,URL都不应该永远存在,从而避免暴力探测。
  4. 我是这样做的。

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

答案 1 :(得分:2)

第一部分请看 Generating Private, Unique, Secure URLs。对于过期,您只需将唯一键创建时间戳存储在数据库中,并且仅允许您的操作在例如​​now-keyCreatedAt <3天时执行。另一种方法是让cron或Quartz作业定期删除那些为“now-keyCreatedAt&lt; 3天”评估为真的行。

答案 2 :(得分:0)

我认为你可以以无状态的方式做到这一点,即没有其他人建议的数据库表。

  • 正如mtnygard建议的那样,制作一个URL参数的SHA-1哈希值和一个秘密盐字符串。
  • 将哈希值添加为URL上的必需参数。
  • 在电子邮件中发送网址。

当用户点击网址时:

  • 再次计算哈希值,并将计算出的值与网址上的值进行比较,以验证网址的完整性。

只要你永远不泄露你的秘密盐字符串,就没有人能够伪造对系统的请求。但是,与其他提案不同,此提案不会阻止重播旧网址。根据您的情况,这可能是也可能不可取。