php - 屏蔽自动递增的主键

标签 php mysql

目前我有一个显示工作机会信息的 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 将变为 7CLZJ9999 将变为 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/

相关文章:

php - 使用 PHP 上传多张图片

javascript - 多维 Javascript 数组到 Php 页面

php - 获取最后一小时插入的最后一项

mysql - 正向工程 MySQL Workbench 错误 1064

mysql - 是否可以计算 MySQL 查询中的字数(不包括 HTML)?

php - 如何设置包含目录中的所有 PHP 脚本?

php - Symfony2 + Doctrine INSERT 查询失败且没有错误

php - C++ 中的 Linux 守护进程处理 PHP 请求

MySQL 右连接数据计数不正确

php - 将IP地址作为整数存储在数据库中