В настоящее время у меня есть таблица MySQL, которая отображает информацию о возможностях трудоустройства. У меня есть автоинкрементный первичный ключ, и я хочу кодировать его, чтобы его не было легко узнать
Таким образом, ключ «1» будет преобразован в нечто короткое, например «AE93DZ». Так что для целей URL это не что-то вроде somesite.com/view/1
Primary Key Unique Id | Job Name
1 | Gardening at X
2 | Dishwasher at Y
3 | Etc
4 | Etc
Первичный ключ должен быть в состоянии быть декодированным обратно в его исходный ключ, чтобы я мог искать в базе данных, например, если пользователь щелкнул по сообщению, ему нужно было найти это сообщение о работе.
Я попытался с помощью Base64 кодирования ключа.
public static function encode( $input )
{
$salt= "example_salt";
$encrypted_id = base64_encode($input . $salt);;
return $encrypted_id;
}
public static function decode( $raw )
{
$salt = "example_salt";
$decrypted_id_raw = base64_decode($raw);
$decrypted_id = preg_replace(sprintf('/%s/', $salt), '', $decrypted_id_raw);
return $decrypted_id;
}
Шифрование возвращает что-то вроде
OE1ZX1SKJS3KSJNMg ==
Который слишком длинный и содержит знаки "=".
2 ответа
Я подумал, что изменение базы идентификатора и добавление смещения может дать вам хороший короткий способ скрыть идентификатор. Что-то вроде этого:
function obfuscate($number)
{
$offset = 12345678;
return strtoupper(base_convert($number + $offset, 10, 36));
}
function deobfuscate($code)
{
$offset = 12345678;
return base_convert($code, 36, 10) - $offset;
}
Здесь 1
станет 7CLZJ
, а 9999
станет 7CTP9
. Коды гарантированно будут уникальными. При преобразовании в базу 36 код будет содержать только число 0 ... 9 и буквы A .... Z.
Простой, но эффективный. Пожалуйста, сделайте $offset
поле в вашем классе.
Это только отодвигает вас от простых номеров идентификатора, но никак не помогает защитить идентификатор.
Если вы считаете, что последовательные числа в базе 36 являются проблемой, вы можете добавить коэффициент. Например, простое число 5197
. Как это:
function obfuscate($number)
{
$offset = 73074643;
$factor = 5197;
return strtoupper(base_convert($factor * $number + $offset, 10, 36));
}
function deobfuscate($code)
{
$offset = 73074643;
$factor = 5197;
return intdiv(base_convert($code, 36, 10) - $offset, $factor);
}
Что будет намного сложнее увидеть любую логику в нумерации:
1 = 17ICRK
2 = 17IGRX
3 = 17IKSA
4 = 17IOSN
5 = 17IST0
Значения в кодировке Base64 по-прежнему легко узнаваемы. $hash = hash('crc32', $input);
, но лучшей идеей будет генерирование UUID, например $uuid = uniqid();
и используйте это вместо ID
Похожие вопросы
Новые вопросы
php
PHP — это открытый, мультипарадигмальный, динамически типизированный и интерпретируемый язык сценариев, изначально разработанный для веб-разработки на стороне сервера. Используйте этот тег для вопросов о программировании на языке PHP.