2013-01-24 103 views
1

我有一个跟踪点击的网址,我想阻止用户共享该网址。Ruby:基于时间的加密密钥?

所以,我的想法是创建一个有一个字符串这是某种形式的加密时间戳(与盐)唯一的URL,如果该链接被点击5分钟是加密的时间戳的范围内,那么这将是有效。

有没有更好的方式来做到这一点?如果不是的话,我将如何解密它,因为这是什么时候生成的时间戳与它被点击的时间大部分时间是不同的?

+0

这应该有效,但它似乎可以简单地传出一个随机数并记住这个数字5分钟。 –

+0

如果您能够解密URL并获得生成时间,将它与点击时间进行比较并查看它是否在五分钟之内不是微不足道的吗? – sawa

+0

@sawa我想这就是我遇到的麻烦。如果我根据“1358999780 + MY_SALT”进行加密......如果unix时间戳完全不同,我该如何解密? – Shpigford

回答

0

当提供页面时,生成一个时间戳,与时区UTC相协调。对称加密(例如,使用AES-256)并将其放在URL中。

当用户要求去一个URL与这样的加密时间戳,使用相同的密钥解密(编辑:使键盐渍哈希问题的内容,这样,每一个不同的内容有不同的,但总是一样的,关键)。如果时间戳小于5分钟前,而服务器的时间戳转换为时区UTC,则拒绝它,否则接受它。

用户不能通过输入不同的加密时间戳来欺骗你,因为他们不知道也找不到你的密钥(即使知道它会是什么时间戳,并且加密算法没有提供足够的信息找出你的密钥),所有的时间戳选择和比较都在服务器端完成。

编辑:编辑时,他们也不能采取时间戳有效的一段内容,并附加到另一段内容有效的时间戳。

+0

如果您没有重要的安全需求,那么我认为这种方法很好,否则如果您使用固定盐,将有可能中断加密(最终)。 – Lummo

+0

虽然我并不关注我如何解密字符串。解密时,我不知道原始时间戳。 – Shpigford

+1

您使用密钥K加密时间戳,并以加密的时间戳结束。稍后,您使用相同的密钥K解密时间戳,并返回原始时间戳。 – Lummo

2

我认为已经给出的评论和回答过于复杂。这个问题似乎与密码重置链接类似。你可以只:

  1. 生成随机令牌和存储(为了提高安全性或PBKDF2(token, salt))它的盐渍散列以及到期时间一起在数据库中。

  2. 每当有人使用该URL,将其散列并根据存储的副本进行验证,并确保时间未过期。

任何“加密时间戳”方案仍然有你如何安全地与AES密钥处理的问题。要么你有一个需要存储的随机密钥,要么是可导出的密钥,在这种情况下,它是不安全的。

您的威胁模型可能应该假设妥协的应用程序或数据库将导致另一方的妥协。在这种情况下,只需存储令牌并且不要增加复杂性。

如果你仍然想在URL中嵌入时间戳,你可以看看Azure Shared Access Signatures的工作方式,其中包括URL中的SHA256-HMAC。