Безопасная ссылка отписки — сколько шифрования достаточно?

Мои пользователи могут подписаться на темы, которые отправляют им электронное письмо с простой ссылкой для отказа от подписки. Эта ссылка содержит зашифрованный подписчик и проверяющий идентификатор пользователя с помощью этого процесса:

// 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-адресах и текстовых электронных письмах. Также существует риск того, что ссылка будет разорвана в текстовых почтовых клиентах.

Если это будет взломано, то больше всего рискуют записи подписки, помеченные как просроченные. Должен ли я беспокоиться о переутомлении (или о чем-либо еще) Есть ли более простой, но все же безопасный метод? Я нуб с шифрованием. Основной вопрос — сколько достаточно?

0

Решение

Более простой метод — это случайная строка определенной длины (например, 30 символов), хранящаяся в таблице с unique ограничение на это поле. Это случайное значение не имеет никакого значения, кроме БД, и не может быть расшифровано, поскольку в нем нет информации. Это означает что-либо, только когда вы используете его в предложении where для поиска записи в этой таблице.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]