为了账号安全,请及时绑定邮箱和手机立即绑定

屏蔽自动递增的主键

屏蔽自动递增的主键

PHP
回首忆惘然 2021-11-26 16:22:57
目前我有一个 mysql 表,显示有关工作机会的信息。我有一个自动递增的主键,我想编码所以它不容易识别。因此,键“1”将被转换为诸如“AE93DZ”之类的简短内容。因此,出于 URL 目的,它不像 somesite.com/view/1Primary Key Unique Id   |   Job Name1                       | Gardening at X2                       | Dishwasher at Y3                       | Etc4                       | 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==它太长并且包含“=”符号。
查看完整描述

2 回答

?
Helenr

TA贡献1780条经验 获得超4个赞

我认为更改 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 


查看完整回答
反对 回复 2021-11-26
?
aluckdog

TA贡献1847条经验 获得超7个赞

Base64 编码的值仍然很容易识别。
您可以创建 ID 的散列,例如$hash = hash('crc32', $input);,但更好的主意是生成 UUID,例如$uuid = uniqid();并使用它而不是 ID

查看完整回答
反对 回复 2021-11-26
  • 2 回答
  • 0 关注
  • 154 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信