Я вижу три шага здесь. Сначала попробуйте сжать данные. С таким небольшим количеством данных bzip2 может сэкономить вам 5-20%. Я бы добавил охранника, чтобы убедиться, что он не увеличит объем данных. Этот шаг может не стоить.
use Compress::Bzip2 qw(:utilities);
$data = memBzip $data;
Вы также можете попробовать уменьшить длину любых ключей и значений в данных вручную. Например, first_name
может быть уменьшено до fname
.
Во-вторых, зашифруйте его. Выберите свой любимый шифр и используйте Crypt :: CBC. Здесь я использую Rijndael, потому что это достаточно хорошо для АНБ. Вы захотите провести сравнительный анализ, чтобы найти наилучший баланс между производительностью и безопасностью.
use Crypt::CBC;
my $key = "SUPER SEKRET";
my $cipher = Crypt::CBC->new($key, 'Rijndael');
my $encrypted_data = $cipher->encrypt($data);
Вам придется хранить ключ на сервере. Достаточно поместить его в защищенный файл, чтобы этот файл оставался в качестве упражнения. Когда вы говорите, что ничего не можете хранить на сервере, я предполагаю, что это не включает ключ.
Наконец, Base 64 кодирует его. Я бы использовал модифицированную безопасную для URL базу 64, которая использует - и _ вместо + и /, избавляя вас от необходимости тратить место на URL, кодирующем эти символы в строке базы 64. MIME :: Base64 :: URLSafe охватывает это.
use MIME::Base64::URLSafe;
my $safe_data = urlsafe_b64encode($encrypted_data);
Затем прикрепите его к URL, как хотите. Повторите процесс считывания в обратном порядке.
Вы должны быть в безопасности по размеру. Шифрование увеличит размер данных, но, вероятно, менее чем на 25%. Base 64 увеличит размер данных на треть (кодировка 2 ^ 6 вместо 2 ^ 8). Это должно обеспечить комфортное кодирование 500 байтов внутри 1K.