安全退订 link - 多少加密就足够了?
Secure unsubscribe link - How much encryption is enough?
我的用户可以通过简单的取消订阅订阅向他们发送电子邮件的话题 link。此 link 包含一个加密的 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
在服务器端,我验证数据和散列,并验证订阅ID对于数据中包含的用户ID是否有效,然后将订阅记录标记为过期。
我为临时登录(有过期日期的登录)开发了这种加密方法,但是 250 个字符的字符串对于简单的取消订阅来说是否过大 link?主要问题似乎是它在 url 和纯文本电子邮件中难看。它还存在 link 在纯文本电子邮件客户端中被破坏的风险。
如果这被黑了,最大的风险是订阅记录被标记为过期。我应该担心矫枉过正(或其他任何事情)吗?有没有更简单但仍然安全的方法?我是加密的菜鸟。基本问题是多少才够?
更简单的方法是将特定长度(例如 30 个字符)的随机字符串存储在 table 中,该字段具有 unique
约束。除了 db 之外,该随机值没有任何意义,并且无法解密,因为其中没有任何信息。只有在 where 子句中使用它来查找 table.
中的记录时,它才有意义
我的用户可以通过简单的取消订阅订阅向他们发送电子邮件的话题 link。此 link 包含一个加密的 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
在服务器端,我验证数据和散列,并验证订阅ID对于数据中包含的用户ID是否有效,然后将订阅记录标记为过期。
我为临时登录(有过期日期的登录)开发了这种加密方法,但是 250 个字符的字符串对于简单的取消订阅来说是否过大 link?主要问题似乎是它在 url 和纯文本电子邮件中难看。它还存在 link 在纯文本电子邮件客户端中被破坏的风险。
如果这被黑了,最大的风险是订阅记录被标记为过期。我应该担心矫枉过正(或其他任何事情)吗?有没有更简单但仍然安全的方法?我是加密的菜鸟。基本问题是多少才够?
更简单的方法是将特定长度(例如 30 个字符)的随机字符串存储在 table 中,该字段具有 unique
约束。除了 db 之外,该随机值没有任何意义,并且无法解密,因为其中没有任何信息。只有在 where 子句中使用它来查找 table.