屏蔽自动递增的主键

目前我有一个 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==


它太长并且包含“=”符号。


回首忆惘然
浏览 155回答 2
2回答

Helenr

我认为更改 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在您的班级中创建一个字段。这只会让您远离 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 

aluckdog

Base64 编码的值仍然很容易识别。您可以创建 ID 的散列,例如$hash = hash('crc32', $input);,但更好的主意是生成 UUID,例如$uuid = uniqid();并使用它而不是 ID
打开App,查看更多内容
随时随地看视频慕课网APP