HTTP URL令牌标准

时间:2010-10-08 10:55:21

标签: java http hash cryptography token

我需要在系统中开发一项功能,允许未注册的用户通过由经过身份验证的用户生成/发送的URL令牌进行一次性系统访问。

例如,用户登录并希望共享一条信息,以便系统生成类似http://host/page?token=jkb345k4b5234k54kh5345kb34kb34的URL。然后,此URL将发送给未注册的用户,该用户将遵循该URL以获得对正常受保护数据的一些有限访问权。

第一个问题 - 是否有任何标准(RFC?IETF?其他?)将定义URL生成?我能找到的唯一的是RFC2289OpenToken,但这些都与我需要做的事情没有直接关系,后者只处于第二次草案状态。

还有另一个设计考虑因素:是否使用单向加密散列函数并使用私有 - 公共密钥对将有效负载存储在本地数据存储VS中,并在唯一字符串本身中编码所有必要的有效负载。

目前我非常倾向于单向散列,因为它会给我更大的自由(有效载荷大小和生成的字符串之间没有依赖关系),并且将来可能会出现更少的潜在问题(例如,如果我决定添加更多有效载荷,那该怎么办 - 如何确保向后兼容性)。最后但并非最不重要的是,意外暴露服务器端私钥需要在密钥重新生成,更新所有实时实例等方面付出巨大努力。如果选择单向散列选项,这些问题都不相关,但也许有一些我忽略的东西? RFC2289更喜欢单向加密功能,而OpenToken选择密钥对选项。

最后,是否有人知道任何用于生成这些库的Java库?

提前致谢。

4 个答案:

答案 0 :(得分:2)

另请查看http://en.wikipedia.org/wiki/Universally_unique_identifierRFC4122。在后端内部,您需要将生成的uuid附加到您的实体,以便稍后可以基于UUID进行验证。

除此之外,令牌通常包括一些数据(例如版本控制+用户数据),然后使用安全的MD5哈希来对其进行“混淆/匿名化”。之后,数据由服务器连接,并再次比较哈希值。

关于java-lib和uuid,请查看UUID-javadoc

答案 1 :(得分:1)

生成随机字符串并将其存储在具有凭据的数据库中。

生成的代码需要具有两个属性:复杂性和唯一性。复杂性确保无法猜测它们,并且唯一性确保永远不会生成相同的代码两次。除此之外,具体方法并不重要。

生成包含两部分的标记字符串。第一部分是时间相关的,其中密钥将以每毫秒的可预测方式递增和改变。第二部分是完全随机的。结合起来,这将为您提供一个独特而复杂的长字符串。

生成令牌时,请使用在使用此令牌时授予的凭据将其存储在数据库中。重要的是这些凭证不会被编码到字符串中,因为这可以确保字符串不会被黑客攻击。

当用户单击带有令牌的链接时,将该令牌标记为数据库中使用的令牌。更好的是设置使用时间戳,以便在第一次点击后24小时可能过期。这种方法使您可以灵活地实现项目所需的特定部分。

我之前在许多不同情况下使用过此解决方案,不仅可以进行一次性系统访问,还可以使用入场代码,礼券代码以及一次性使用的任何内容。用于生成令牌的内容并不重要,因为您可以保证其复杂性和唯一性。

答案 2 :(得分:1)

我将如何做到这一点:

  1. 创建一个令牌(您可以使用UUID)并将其与创建时间以及令牌应授予访问权限的资源一起添加到您的数据库中
  2. 使用网址http://www.myserver.com/page?token=
  3. 向用户发送电子邮件
  4. 当用户导航到url时,创建一个具有所需超时的新会话,并将该会话标记​​为已授权,以查看用户应该能够看到的数据库(如果该令牌不太旧。请检查创建时间与当前时间相比)
  5. 从数据库中删除令牌,或将其标记为已过期

答案 3 :(得分:0)

当用户共享一条信息时,您只需要一个令牌。那么,你不能只生成一个随机令牌,并将其与这条信息(例如数据库字段)联系起来吗?它比做任何加密的东西简单得多......