目前我有一个显示工作机会信息的 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
主键需要能够被解码回它的原始 key ,这样我才能搜索数据库,例如,如果用户要单击该帖子,那么它需要调出该职位帖子。
我试过使用 Base64 编码 key 。
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==
太长且包含“=”符号。
最佳答案
虽然更改 ID 的基数并添加偏移量可以为您提供一个很好的简短方法来混淆 ID。像这样:
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
设为您类(class)中的一个字段。
这只会让您远离 ID 的简单数字,对保护 ID 没有任何帮助。
如果您认为以 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
关于php - 屏蔽自动递增的主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57529162/