我在这里看到三个步骤。首先,尝试压缩数据。使用如此少的数据 bzip2 可能会为您节省 5-20%。我会投入警卫以确保它不会使数据变大。这一步可能不值得。
use Compress::Bzip2 qw(:utilities);
$data = memBzip $data;
您还可以尝试手动减少数据中任何键和值的长度。例如,first_name
可以简化为fname
.
第二,加密。选择您最喜欢的密码并使用 Crypt::CBC。这里我使用 Rijndael,因为它对 NSA 来说已经足够好了。您需要进行基准测试以找到性能和安全性之间的最佳平衡。
use Crypt::CBC;
my $key = "SUPER SEKRET";
my $cipher = Crypt::CBC->new($key, 'Rijndael');
my $encrypted_data = $cipher->encrypt($data);
您必须将密钥存储在服务器上。将其放在受保护的文件中就足够了,保护该文件留作练习。当你说你不能在服务器上存储任何东西时,我认为这不包括密钥。
最后,Base 64 对其进行编码。我将使用修改后的 URL 安全 base 64,它使用 - 和 _ 而不是 + 和 / ,从而使您不必花费空间 URL 对 base 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 内保持舒适。