Простое шифрование и дешифрование с помощью PHP - PullRequest
8 голосов
/ 13 декабря 2010

Мое PHP-приложение использует такие URL-адреса:

http://domain.com/userid/120
http://domain.com/userid/121

Ключи и конец URL в основном являются первичным ключом таблицы базы данных MySQL.

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

Итак, я хочу зашифровать этот Id для отображения так, чтобы его можно было легко расшифровать. Строка не должна становиться намного длиннее.

Какой лучший способ шифрования для этого?

Ответы [ 9 ]

7 голосов
/ 13 декабря 2010

Простое скрытие: Base64 кодирует их, используя base64_encode.
Теперь ваш http://domain.com/userid/121 становится: http://domain.com/userid/MTIx
Хотите больше, делайтееще раз, добавьте несколько букв вокруг него.

Жесткое скрытие: Используйте любой метод шифрования с использованием библиотеки MCrypt .

6 голосов
/ 13 декабря 2010

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

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

4 голосов
/ 13 декабря 2010

У вас есть множество вариантов:

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

  • Запустите фактическое шифрование на основе ключей, например на основена PHP MCrypt.У вас есть доступ к мощным криптографическим алгоритмам, но большинство безопасных алгоритмов имеют тенденцию выводить строки, которые намного длиннее, чем вы ожидаете.XOR делает то, что вы хотите, но он не препятствует доступу к последовательным значениям (и ключ довольно просто определить, учитывая априорные знания о числах).

  • Запустите проверку на основе хеша: вместо использования 121 в качестве идентификатора, используйте 121-a34df6, где a34df6 - первые шесть символов md5 (или другиеHMAC) из 121 и секретный ключ.Вместо декодирования вы извлекаете 121 и заново вычисляете шесть символов, чтобы увидеть, соответствуют ли они тому, что отправил пользователь.Это не скрывает 121 (оно все еще здесь, перед дефисом), но без знания секретного ключа посетитель не сможет сгенерировать шесть символов для фактического просмотра документа с номером 121.

    * 1023.*
  • Используйте XOR с перемешиванием: перемешайте биты в 30-битном идентификаторе, затем примените XOR.Это затрудняет идентификацию XOR, поскольку шаблон случайного порядка также скрыт.

  • Используйте XOR с ключами по требованию: используйте fb37cde4-37b3 в качестве ключа, где первая часть - XOR121 и md5('37b3'.SECRET) (или другой способ создания ключа XOR на основе 37b3 и секрета).

Не используйте base64, его легко перепроектировать: если MTIx равно 121, то MTIy равно 122 ...

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

1 голос
/ 13 декабря 2010

Самый простой, но мощный метод шифрования: XOR с секретным ключом. http://en.wikipedia.org/wiki/XOR_cipher Нет практического снижения производительности.

Представление Base64 не является шифрованием! Это еще один способ сказать то же самое.

Надеюсь, это поможет.

0 голосов
/ 23 апреля 2013

Когда пользователь нажимает на ссылку, вы не должны использовать первичный ключ. Вы можете использовать pkey в сеансе и получить его из этого сеанса. Пожалуйста, не используйте строку запроса ....

0 голосов
/ 13 декабря 2010

Вероятно, я бы сказал, что лучше создать случайную строку для каждого пользователя и сохранить ее в своей базе данных, чем получить хеш-код.Если вы используете общий хеш, все равно очень легко перебирать все страницы; -)

Я бы написал это в комментариях, но у меня пока нет представителя (*?).

0 голосов
/ 13 декабря 2010

вы можете использовать функции base64_encode и base64_decode для шифрования и дешифрования ваших URL

0 голосов
/ 13 декабря 2010

создать уникальную строку для каждого пользователя и использовать ее в своих URL

http://domain.com/user/ofisdoifsdlfkjsdlfkj вместо http://domain.com/userid/121

0 голосов
/ 13 декабря 2010

Затенение URL никогда не защитит его.Это делает его труднее читать, но не намного сложнее манипулировать.Вы можете использовать шестнадцатеричное представление чисел или что-то подобное, чтобы скрыть это.Те, кто умеет читать в шестнадцатеричном формате, могут изменить ваш URL в любом случае:

$hexId = dechex($id); // to hex
$id = hexdec($hexId); // from hex
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...