Как мне создать уникальную ссылку для каждого бронирования, чтобы мои пользователи могли видеть отдельное письмо? - PullRequest
2 голосов
/ 11 февраля 2011

Подтверждение по электронной почте отправляется, когда пользователи моего сайта совершают бронирование. Мне было предложено добавить "Не удается просмотреть это письмо?" ссылка наверх, которая ссылается на электронную почту на сайте.

Мне трудно понять, как создать ссылку, чтобы пользователь мог просмотреть это письмо.

Обратите внимание, что я использую стороннюю систему бронирования, которая дает мне код подтверждения, такой как: 12345BE913913, где 12345 - это свойство, BE - это всегда BE, а 913913 - это дополнительный номер. Мне интересно, могу ли я просто хешировать этот номер и сделать ссылку? Например, sha1('12345BE913913'), который превращается в 070bae598f481351e24975d6509fc0a73cad9a17

И тогда ссылка в письме становится примерно такой: href="http://blah.com/email/view/070bae598f481351e24975d6509fc0a73cad9a17

Вопрос № 1: Это довольно стандартный, безопасный способ сделать это?

Если это так, у меня есть еще одна проблема ... Мне нужно было бы ввести эту информацию, чтобы сгенерировать письмо в моем email/view. Веб-служба принимает только код подтверждения, поэтому мне нужно будет указать исходный код 12345BE913913. Поэтому я не могу просто взять все коды подтверждения, подсказать их все и посмотреть, какой из них равен 070bae598f481351e24975d6509fc0a73cad9a17.

Вопрос № 2: Это мой единственный способ получить информацию о бронировании через веб-сервис, который принимает исходный код подтверждения, создать локальную базу данных, в которой хранятся все коды подтверждения, а затем получить все из них SHA1 и посмотреть, равняется ли это 070bae598f481351e24975d6509fc0a73cad9a17, чтобы подтянуть его? Неправильно использовать действительный код подтверждения в электронном письме?

Ответы [ 3 ]

1 голос
/ 11 февраля 2011

Хеширование реального идентификатора и сохранение хеша в качестве ключа в таблице к исходному значению для «обратного просмотра» является традиционным подходом.

Однако это не единственный вариант. Вы можете зашифровать код подтверждения. Так как коды подтверждения являются короткими и (я предполагаю) уникальными, было бы хорошо использовать режим ECB с блочным шифром, который позволял бы сохранять результирующий текст шифра коротким (16 байтов вместо 20 байтов SHA-1).

Предостережение с ECB состоит в том, что один и тот же код подтверждения всегда будет давать один и тот же зашифрованный текст. Скорее всего, код отправляется только в одном письме; но если оно будет отправлено более одного раза, злоумышленник сможет определить, что электронное письмо относится к одному и тому же коду подтверждения (но он не сможет определить сам код подтверждения).

Я не уверен, что вы подразумеваете под "безопасным". Что можно сделать с номером подтверждения? Смогут ли они использовать хеш для получения номера подтверждения с вашего сайта? Если вы не используете S / MIME (или PGP), электронное письмо не является частным; предположим, что злоумышленник может прочитать электронную почту.

1 голос
/ 11 февраля 2011

Почему бы не передать как номер подтверждения (в качестве первичного ключа), так и MAC-адрес, связанный с ним (чтобы люди не могли угадать URL-адреса.

Псевдокод генерации URL-адреса:

$mac = HMAC_SHA1($server_secret, $confCode);
$url = "http://$baseURL?conf=$confCode&m=$mac";

EmailОтображение псевдокода:

$mac = getParam("m");
$confCode = getParam("conf");
$expectedMac = HMAC_SHA1($server_secret, $confCode);
if($mac != $expectedMac) { # Or in real perl, ne instead of !=
  return errorPage();
}
return email($confCode);
1 голос
/ 11 февраля 2011

Зачем использовать SHA1, если вам нужно, чтобы операция была обратимой?Почему бы вместо этого не зашифровать его, используя симметричный алгоритм, такой как Twofish, для генерации URL.Вы можете расшифровать его на стороне сервера, используя свой ключ, чтобы восстановить исходный код подтверждения, а затем отправить код подтверждения в стороннюю систему бронирования.Поскольку никто не имеет ваш ключ, никто не может восстановить код подтверждения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...