故事背景:我有一个ePetition类型的服务运行在我的网站上,我电子邮件给人们一个链接,他们可以‘同意’的请愿。此链接将只包含发送者的'petitionID‘和’用户名‘。
这些信息并不特别敏感,但我仍然要求它是防篡改的,因为我希望它们能够接受,而无需在数据库中登录或存储值。
我想使用Java的String.hashCode()函数。
也许拥有url作为:用户名,petitionId,然后是一个散列
www.website.com/accept.jsp?user='username'&id='petid'&token='1039678106'令牌可以由用户名+id(来自链接)+datePetitionStarted(类似于url中未公开的盐类)组成,例如:
String test = "mike.Who@petitionwebsite.com+1524+09/02/2016";
System.out.println(test.hashCode());这将给我一个'1039678106‘的散列,这意味着服务器端,我可以接受ID参数,人的用户名,并使用datePetitionStarted,获取哈希代码并比较它们。
你认为这是防止篡改的有效方法吗?
我真的想要一种象征性的接受请愿书的方法,所以如果有人有其他的想法,那就太棒了。
谢谢,
麦克
发布于 2016-02-09 12:00:43
这是我所做的(这实际上是防篡改的)。我不使用java脚本,因为用户无论如何都可以禁用它。我只需创建一个UUID (它存储在用户详细信息旁边的数据库中),然后在注册过程中创建一个在电子邮件中发送的链接。
http://my_domain_name/Activate?key=6faeecf5-9ab3-46f4-9785-321a5bbe2ace当用户单击上面的链接时,服务器端代码将检查此键是否实际存在于数据库中,在这种情况下,它将激活用户帐户。
发布于 2016-02-09 12:54:25
虽然String.hashcode()可以跨实例为相同的字符串返回相同的值,但这并不一定。
每当在执行Java应用程序期间在同一个对象上多次调用它时,hashCode方法必须始终如一地返回相同的整数,前提是不修改关于该对象的相等比较中使用的任何信息。--从一个应用程序的一个执行到同一个应用程序的另一个执行,这个整数不需要保持一致。
Object.hashcode的API文档。
因此,如果你要沿着这条路线走下去,你应该使用你自己的散列。
https://stackoverflow.com/questions/35290070
复制相似问题