【问题标题】:Secure unsubscribe link - How much encryption is enough?安全退订链接 - 多少加密才足够?
【发布时间】:2015-05-16 12:09:19
【问题描述】:

我的用户可以订阅线程,通过简单的取消订阅链接向他们发送电子邮件。此链接包含一个加密的 subscribeid 和一个通过此过程验证的用户 ID:

// generate iv and create encrypted data
$iv = openssl_random_pseudo_bytes(16);
$encrypted = openssl_encrypt($data, 'AES-128-CBC', ENCRYPTION_KEY,0,$iv);

// send the iv along with the encrypted text
$ciphertext = $iv . $encrypted;

// generate a hash which can verify the data has not changed
$hash = hash_hmac('sha1', $ciphertext, ENCRYPTION_KEY)

// encode the data for email link
encoded = urlencode(base_64_encode($hash.$ciphertext))

这会生成一个字符串,如:

www.site.com?id=YzU4MzAzMjljZWUyYmNmY2JmNjE5MGE0YzVhNDUzZjI0YmJmZWI3YoyqdFj6dxA/OVJOw2UN7HErYVV5dmhUVEJzVHBsUGd3aDNHbjVYbmFMa0dhUFczSmpXWnFBN0FyVGxkVml3S041VlhsSXd6TitJYld5QmdhWEFkL3hYSDFiRWdzN0wvNjFXYURiYlNreXpLQ1ZqWnhHMmdCSlZGaUVxU3ZGY3I3RW9GZkJYN3l4Vkp3YmJicg

在服务器端,我对数据进行哈希验证,并验证subscribeid对于数据中包含的userid是否有效,然后将订阅记录标记为过期。

我为临时登录(具有到期日期的登录)开发了这种加密,但是对于简单的取消订阅链接来说,250 个字符的字符串是否过大?主要问题似乎是它在 url 和纯文本电子邮件中不美观。它还存在链接在纯文本电子邮件客户端中被破坏的风险。

如果这被黑客入侵,最危险的是订阅记录被标记为过期。我是否应该担心过度杀伤(或其他任何事情)。有没有更简单但仍然安全的方法?我是加密的菜鸟。基本问题是多少才够?

【问题讨论】:

  • 任何敏感数据都不应离开您的系统,无论是否加密。敏感数据应与随机且唯一的值(例如哈希)一起存储在数据库中。如果需要,哈希可以出去并用于查找其他数据。此外,它不应该是“临时登录”。该页面不应提供任何信息,只需获取哈希值,更新用户设置并回显一条消息“谢谢,已取消订阅。如果您想更改您的电子邮件设置,请在此处登录”。
  • @JonathanKuhn - 我提到的临时登录是用于电子邮件中的不同链接,它将用户带到订阅的帖子。它是暂时的,因此电子邮件不是永久性的安全威胁。在这种情况下,发送散列并查找其余信息的散列是有意义的。感谢您的提示。

标签: php encryption openssl unsubscribe


【解决方案1】:

更简单的方法是存储在表中的特定长度(例如 30 个字符)的随机字符串,对该字段具有unique 约束。除了数据库之外,该随机值没有任何意义,并且无法解密,因为其中没有信息。只有当您在 where 子句中使用它来查找该表中的记录时,它才有意义。

【讨论】:

  • 我知道简单的答案是显而易见的。这对这种情况是有意义的。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-19
  • 2015-04-01
  • 2016-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多