Отправка зашифрованного текста в URL - PullRequest
2 голосов
/ 11 февраля 2011

У меня очень простой (довольно глупый) вопрос, я надеюсь, что кто-то сможет прояснить мне этот вопрос:)

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

Как только пользователь щелкнет эту ссылку электронной почты, мой код на стороне сервера будет анализировать и расшифровывать запрос userID.строковый ключ для получения идентификатора пользователя и выполнения каких-либо действий с ним.

Я не могу использовать кодировку base64, поскольку ее можно изменить, и «хакеры» могут узнать настоящий идентификатор пользователя.Я должен зашифровать идентификатор, но когда я использую AES-алгоритмы для шифрования, зашифрованный текст не «понятен» браузером, то есть я не могу передать зашифрованный текст userId как часть URL-адреса, потому что он содержит некодированные символы, такие как«/», который браузер не может пропустить.Один из вариантов, который я могу придумать, - это закодировать Base64 зашифрованный текст, как только я отправлю его через URL.Тогда я могу bease64 декодировать и расшифровывать его.

Этот подход лучше, чем использование Uri.EscapeDataString () для зашифрованного текста?

Ответы [ 4 ]

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

Используйте односторонний хеш, такой как SHA1 или MD5, и используйте JavaScript для отправки значений в зашифрованном виде. Затем, если хакер перехватит запрос, он будет иметь только хэши, а не фактические значения. Тем не менее, они могут отправлять хеши для входа в систему; Одно из решений состоит в том, чтобы включить параметр JavaScript (сгенерированный с помощью вашего серверного языка) на основе IP-адреса (но для хакера найти формулу для него нет возможности) и использовать его для подсчета хешей имени пользователя и пароля.

Затем на стороне сервера вы должны сделать (в данном случае на PHP):

$ipHash = sha1("random" . $_SERVER['REMOTE_ADDR'] . "salt_here10381") // place this as a hidden element in the form and use it in the JavaScript to calculate the hash
$userHash = $_POST['userHash'];
$passwordHash = $_POST['passwordHash']
// TODO: Escape $ipHash, $userHash, $passwordHash
$results = mysqli->query("SELECT * FROM `users` WHERE SHA1(CONCAT('" . $ipHash . "', `user`)) ='$userHash' AND SHA1(CONCAT('" . $ipHash . "', `password`)) = " '$passwordHash'");

Затем, если хакер захочет войти в систему с найденным хэшем и именем пользователя, ему потребуется тот же IP-адрес пользователя, который первоначально входил в систему, чьи учетные данные были перехвачены.

Обратите внимание, что это предполагает, что у вас есть пароли, хранящиеся в вашей базе данных в виде простого текста, что вы никогда не должны делать.

Для хеширования с SHA1 на стороне клиента посмотрите на this .

Чтобы ответить на ваш конкретный вопрос (я вижу, у меня немного не по теме, упс), было бы приемлемо base64 закодировать хэши при отправке их на сервер. Если возможно, попробуйте отправить его как данные POST и сохранить в файле cookie или в переменной сеанса.

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

Вы должны продолжать кодировать данные AES с помощью base64, поскольку в этот момент они, скорее всего, являются двоичными, а не строкой, которую можно экранировать. Вам также следует убедиться, что вы используете безопасную кодировку base64 url.

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

При создании электронной почты вам необходимо зашифровать идентификатор пользователя, затем base64-кодировать его, а затем URL-адрес. Поместите это как параметр userID в ссылке.

При расшифровке письма вы делаете то же самое в обратном порядке; получите параметр userID, URL расшифруйте его, base64 расшифруйте, затем расшифруйте.

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

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

Я думаю о простом решении: вы пытаетесь сгенерировать случайное число (сделать его ключом) и использовать для шифрования некоторую простую технику, например, XOR, используя значение ASCII символов в имени пользователя с ключомчто вы сгенерировали. так что длинный случайный ключ приводит к большему результату.

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