安全取消订阅链接 - 加密多少就足够了?

时间:2015-03-13 21:04:49

标签: php encryption openssl unsubscribe

我的用户可以订阅线程,向他们发送包含简单取消订阅链接的电子邮件。此链接包含加密的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对数据中包含的用户ID是否有效,然后将订阅记录标记为已过期。

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

如果要被黑客攻击,那么最有风险的是订阅记录被标记为已过期。我应该担心过度杀伤(或其他任何事情)。有更简单但仍然安全的方法吗?我是加密的菜鸟。基本问题是多少就足够了?

1 个答案:

答案 0 :(得分:2)

更简单的方法是一个特定长度的随机字符串(例如30个字符),存储在该字段上具有unique约束的表中。除了db之外,该随机值没有任何意义,因为其中没有信息,所以无法解密。当你在where子句中使用它来查找该表中的记录时,它只意味着什么。