我对密码学的态度不是很强,所以有我的问题.
我们的应用程序 - 论坛 - 向用户发送新消息的通知,如果他们选择了它.在电子邮件中应该有一个取消订阅此消息的链接.现在,我希望该链接正常工作,即使用户当前未通过我们的服务进行身份验证(无cookie).
为此,我决定用SHA1签署请求,如下所示:
http://example.com/unsubscribe?u=234&s=52342&h=0b071440146545eaf3f00ef9cdeb1d47d006dfff
这u是用户的ID,想要取消订阅,s是一些随机的盐,h是通过连接动作的名称(取消订阅),参数及其值(u = 234s = 52342)和一些秘密字符串计算的安全哈希,在我们的服务配置中指定并计算结果字符串的SHA1哈希值:
sha1('unsubscribeu=234s=52342supersecret')
我的问题是关于这个参数s,每次都是随机生成的.它是否会增加安全性?真的需要吗?
如果我改为加密,那么将这种盐添加到被加密的数据中是否有意义?
这更像是一个理论问题,因为有人不太可能想要在我们的服务中猜测"超级秘密"只是恶作剧 - 取消订阅一堆用户,但仍然很有趣.
盐的主要用途是防止比较各种哈希值进行分析;例如,通过比较密码的哈希值来查看任意两个用户是否具有相同的密码。如果添加随机盐,则无法进行比较(除非密码和盐相等 - 这不应该发生,因为盐应该是随机的)
就您而言,我认为盐值没有任何好处,除非您还将这些盐存储在服务器端并在使用后“过期”它们,以便无法使用某个取消订阅链接(及其盐值)稍后再次“重播”。