Ruby:基于时间的加密密钥?

时间:2013-01-24 02:44:42

标签: ruby encryption

我有一个跟踪点击次数的网址,我想阻止用户分享该网址。

所以,我的想法是创建一个唯一的URL,其中包含某种加密时间戳(带有盐)的字符串,如果在该加密时间戳的5分钟内单击了该链接,那么它将是有效的

有更好的方法吗?如果没有,我将如何解密它,因为生成它的时间戳与点击它的时间戳在大多数时间会有所不同?

2 个答案:

答案 0 :(得分:2)

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

  1. 生成随机令牌并在数据库中存储盐渍哈希(或PBKDF2(token, salt)以增加安全性)以及到期时间。

  2. 每当有人使用该网址时,请对其进行哈希并根据您存储的副本进行验证,并确保时间尚未过期。

  3. 任何“加密时间戳”方案仍然存在安全处理该AES密钥的问题。你有一个你需要存储的随机密钥,或者它是可派生的,在这种情况下它是不安全的。

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

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

答案 1 :(得分:0)

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

当用户要求转到具有此类加密时间戳的URL时,请使用相同的密钥对其进行解密(编辑:将密钥设为有问题内容的 salted 哈希,以便每个人都有所不同内容有不同但始终相同的关键)。如果时间戳小于5分钟前与服务器转换为时区UTC的时间戳相比,请拒绝它,否则接受它。

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

编辑:通过编辑,他们也无法对一段内容采用有效的时间戳,并将其附加到对另一段内容有效的时间戳。