Мои пользователи могут подписываться на темы, которые отправляют им электронное письмо с простой ссылкой для отказа от подписки. Эта ссылка содержит зашифрованный идентификатор подписки и идентификатор пользователя, проверяющий этот процесс:
// 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
На стороне сервера я проверяю данные и хэш, проверяю, что идентификатор подписки действителен для идентификатора пользователя, содержащегося в данных, а затем отмечаю срок действия записи подписки.
Я разработал это шифрование для временных входов в систему (логины с датой истечения срока действия), но является ли излишним 250-символьная строка для простой ссылки для отказа от подписки? Основные проблемы, по-видимому, заключаются в том, что это неприглядно в URL-адресах и текстовых электронных письмах. Это также может привести к тому, что ссылка не будет работать в почтовых клиентах с открытым текстом.
Если это должно быть взломано, больше всего рискуют подписные записи, помеченные как просроченные. Должен ли я беспокоиться об излишестве (или о чем-то еще). Есть ли более простой, но все же безопасный метод? Я нуб с шифрованием. Основной вопрос: насколько хватит?