привет, я работаю с Laravel, создавая что-то вроде социального сайта,
профили пользователей — / users / id
я хотел бы скрыть идентификаторы пользователя за чем-то вроде хэша, но в шестнадцатеричной форме с одинаковой длиной
идеальным было бы, если бы его нельзя было вернуть к исходному номеру
да, я могу просто прикрепить случайное число к каждому пользователю, но каждый раз будет проверяться, не привязано ли это число к другому пользователю.
я попытался $ id_transform = hexdec (substr (md5 (md5 ($ id_transform)), 10, -10)); но это не создает уникальные строки одинаковой длины
Звучит так, будто вы хотите зашифровать свои идентификаторы.
Один простой способ сделать это в PHP может быть:
$id = 12345;
$key = "example key";
$encrypted_id = bin2hex(openssl_encrypt(
pack("P", $id), "BF-ECB", $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING
));
print "$encrypted_id\n";
# -> 662b480853d3cc20
$decrypted_id = unpack("P", openssl_decrypt(
hex2bin($encrypted_id), "BF-ECB", $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING
))[1];
print "$decrypted_id\n";
# -> 12345
Несколько очень важных замечаний:
Это не особенно безопасно. Достаточно сделать последовательность значений менее очевидной.
Вход $id
должно быть неотрицательным целым числом. Максимальное значение 264-1, что должно быть хорошо для большинства приложений. Обратите внимание, что этот код не может обрабатывать отрицательные идентификаторы.
Подтвердите свои данные. Зашифрованный идентификатор всегда будет 16 шестнадцатеричных символов; любое другое значение должно быть выброшено.
$key
должна быть секретной строкой длиной от 4 до 56 символов. Он должен отличаться для каждого другого типа идентифицируемого идентификатора, иначе злоумышленник может поменять местами зашифрованные идентификаторы в разных контекстах. Это не должен использоваться для любого другого шифрования в вашем приложении.
Идентификатор мусора будет обычно в результате получается очень большое число в качестве расшифрованного идентификатора. Если вы знаете, что идентификаторы в вашем приложении всегда будут меньше 232, Вы можете сравнить результат с этим, чтобы определить значения, которые могут быть недействительными. Однако имейте в виду, что всегда существует небольшая вероятность того, что случайный ввод окажется действительным идентификатором.
Не пытайтесь подставить в другой шифр BF-ECB
(Blowfish, режим ECB), или изменить упаковку, если вы не очень уверен в том, что ты делаешь. Тот факт, что Blowfish использует необычно маленький 64-битный размер блока, имеет решающее значение для этого приложения.
Обычная причина для людей, желающих зашифровать или замаскировать параметры URL, заключается в том, что этот параметр может использоваться для утечки информации — например, когда идентификаторы пользователя являются последовательными, что означает, что вы можете увеличивать или уменьшать их, чтобы легко находить других пользователей, или когда вы помещаете приватный информация на странице доступна с предсказуемым идентификатором.
Лучшее решение этой проблемы — не иметь его в первую очередь. Если вы сделаете свои идентификаторы пользователя случайной последовательностью символов, скажем, 10 или 15 символов, ваши проблемы исчезнут:
Обратите внимание, что это не держит секретные идентификаторы пользователей — если их общедоступный профиль /profile/foobar
тогда все будут знать, что их удостоверение личности foobar
, Однако безопасность вашей системы на самом деле не должна зависеть от того, чтобы держать публичный идентификатор в секрете!
Я пропустил ловушки безопасности, которые могут возникнуть при попытке свернуть какое-то шифрование параметра URL. Вы можете прочитать больше на тему (не!) шифрование параметров URL здесь: https://paragonie.com/blog/2015/09/comprehensive-guide-url-parameter-encryption-in-php