整数的基本混淆算法

Basic obfuscation algorithm for integer

我正在寻找某种混淆双向算法,它将整数(在一个范围内,如 [0 , 2^10])映射到一个字符串,以避免 URL 操纵

我看到 建议生成随机字符串并将其用作 ID,但我需要将此字符串与现有数据相关联,我不认为这是可扩展的,因为我会必须为 400k 条目生成字符串...此外,我无法加密它,因为我需要将其存储在 NFC 标签中,因此内存非常有限

目前,我正在将 int 转换为 UUID,但最终,这会改变任何东西,它只是带有一些 0 作为填充的 int 值

有这样的吗?

使用原因是:

mywebsite.com/something/1
# becomes
mywebsite.com/something/{string n char long}

在哪里我可以将该字符串转换为 int 以及其他方式,因此没有“简单的方法”让某人去 mywebsite.com/something/2

我只是需要一个想法,但是如果有人在 PHP 中已经有了这样的东西,谢谢

如评论中所述,默默无闻并不安全。但是,这里有一个很容易逆转的想法:

转换为 36 进制(或者可能 35 进制更难预测)

function obfuscate(int $id) : ?string
{
    return $id
      ? strtolower(str_pad(base_convert($id, 10, 36),4,'0', STR_PAD_LEFT))
      : null;
}

function unobfuscate(?string $code) : ?int
{
    return $code
      ? base_convert($code, 36, 10)
      : null;
}


$numbers = [0,1,2,3,4,200,400,560,1000,1234567];
$obscure = [];
foreach($numbers as $number) {
    $obscure[] =  obfuscate($number);
    print obfuscate($number) . "\n";
}

foreach($obscure as $code) {
    print unobfuscate($code) . "\n";
}

// yields:
0001
0002
0003
0004
005k
00b4
00fk
00rs
qglj

1
2
3
4
200
400
560
1000
1234567

要进一步混淆它,您可以在开头或结尾添加随机诱饵 letters/numbers。 (我会让你弄清楚这方面的细节)

不过请注意,您最终可能会得到一些不适合家庭使用的网址 ;)

这里的工作示例: http://sandbox.onlinephpfunctions.com/code/d16a81c9e07c5e26ed4045d6363bbe41763470f0

我忍不住...这里有 26 个字符的工作示例: http://sandbox.onlinephpfunctions.com/code/61c919b7e294fa96377f2fe0edddb874a9a4b9ba