使用防篡改措施验证 'confirm' 电子邮件 link 的防篡改方法?

Tamper proof way to verify a 'confirm' email link with preventive measures for tampering?

上下文故事: 我的网站上有一个 ePetition 类型的服务 运行,我通过电子邮件向人们发送 link,他们可以在其中 'agree' 提交请愿书。此 link 将仅包含发送者的 'petitionID' 和 'username'。

这些信息不是特别敏感,但我仍然要求它是防篡改的,因为我希望他们能够接受而无需登录或在数据库中存储值。

我想到了使用 Java 的 String.hashCode() 函数。

可能 url 为:用户名、petitionId,然后是哈希值

www.website.com/accept.jsp?user='username'&id='petid'&token='1039678106'

令牌可以由用户名+id(来自link)+ datePetitionStarted(如url中未暴露的盐)组成,如:

String test = "mike.Who@petitionwebsite.com+1524+09/02/2016";
        System.out.println(test.hashCode());

这会给我一个散列值“1039678106”,这意味着服务器端,我可以获取 ID 参数、此人的用户名并使用 datePetitionStarted,获取散列码并进行比较。

您认为这是防止篡改的有效方法吗?

我真的很喜欢接受请愿的令牌类型方法,所以如果有人有任何其他想法会很棒。

谢谢,

迈克

这是我所做的(实际上是防篡改的)。我不使用 java 脚本,因为用户无论如何都可以禁用它。我只是创建一个 UUID(存储在用户详细信息旁边的数据库中),然后创建一个 link 在注册过程中通过电子邮件发送。

http://my_domain_name/Activate?key=6faeecf5-9ab3-46f4-9785-321a5bbe2ace

当用户点击上面的 link 时,服务器端代码会检查该密钥是否确实存在于数据库中,在这种情况下它会激活用户帐户。

虽然 String.hashcode() 可能 return 跨实例的相同字符串具有相同的值,但这并不能保证。

Whenever it is invoked on the same object more than once during an execution of a Java application, the hashCode method must consistently return the same integer, provided no information used in equals comparisons on the object is modified. This integer need not remain consistent from one execution of an application to another execution of the same application.

API Object.hashcode 的文档。

因此,如果您要沿着这条路线走下去,您应该使用自己的哈希值。