В настоящее время у меня есть таблица 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 ==

Который слишком длинный и содержит знаки "=".

0
user2515606 16 Авг 2019 в 20:59

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 
4
KIKO Software 16 Авг 2019 в 19:25

Значения в кодировке Base64 по-прежнему легко узнаваемы. Вы можете создать хеш идентификатора, например $hash = hash('crc32', $input);, но лучшей идеей будет генерирование UUID, например $uuid = uniqid(); и используйте это вместо ID

1
Dharman 16 Авг 2019 в 18:12