求轻量整数双向混淆算法 支持整数字符串互转防URL篡改 优先PHP实现
双向整数转字符串混淆方案
核心实现思路
采用异或混淆+自定义进制转换的组合方案,完全匹配你的需求,无需额外存储、计算成本极低、双向可逆,且相邻ID生成的字符串无连续性:
- 第一步:整数混淆。选择一个和你的ID范围位数匹配的固定随机密钥(比如ID范围为
[0, 2^10]时,密钥选10位长度的随机数即可),将原始ID与密钥做异或运算,得到无规律的混淆后整数,相邻ID经过异或后结果完全不连续,避免被用户猜测。 - 第二步:转短字符串。将混淆后的整数转换为自定义高进制字符串,推荐使用62进制(大小写字母+数字组合),
[0, 2^10]范围的整数转换后仅需2位字符串,长度极短完全适配NFC小内存存储需求。你可以自行打乱62进制的字符表顺序,进一步提升猜测难度。 - 第三步:逆向还原。解码时先将字符串按照自定义进制转回混淆整数,再与同一密钥做一次异或运算即可得到原始ID,异或运算两次会自动还原原值,无需额外存储映射关系。
PHP实现代码
<?php // 自定义打乱的62进制字符表,可自行修改,注意不要有重复字符 const CUSTOM_BASE_CHARS = 'f8KpQ2RcTx7zAq9BsDvFgHjLmNnPwStUvYyWwEeRrTtYyUuIiOoPpAaSsDdFfGgHhJjKkLlZzXxCcVvBbNnMm1234567890'; // 固定混淆密钥,可自行修改为和你ID范围匹配的随机数,注意不要泄露 const OBFUSCATION_KEY = 892; // 编码:整数转混淆字符串 function intToObfuscatedStr(int $originalId): string { $obfuscatedId = $originalId ^ OBFUSCATION_KEY; $base = strlen(CUSTOM_BASE_CHARS); $result = ''; while ($obfuscatedId > 0) { $result = CUSTOM_BASE_CHARS[$obfuscatedId % $base] . $result; $obfuscatedId = intval($obfuscatedId / $base); } // 固定补位为2位,可根据ID范围调整补位长度 return str_pad($result, 2, CUSTOM_BASE_CHARS[0], STR_PAD_LEFT); } // 解码:混淆字符串转回原始整数 function obfuscatedStrToInt(string $obfuscatedStr): int { $base = strlen(CUSTOM_BASE_CHARS); $obfuscatedId = 0; foreach (str_split($obfuscatedStr) as $char) { $position = strpos(CUSTOM_BASE_CHARS, $char); if ($position === false) { throw new InvalidArgumentException('字符串包含非法字符'); } $obfuscatedId = $obfuscatedId * $base + $position; } return $obfuscatedId ^ OBFUSCATION_KEY; } // 测试示例 echo intToObfuscatedStr(1); // 输出无规律字符串,示例输出为Ex echo obfuscatedStrToInt('Ex'); // 输出原始ID 1
方案优势
- 无存量改造成本:无需为40万条存量数据生成额外映射关系,所有转换实时计算即可
- 资源占用极低:无复杂加密运算,内存占用可以忽略,转换后的字符串长度极短,完全适配NFC标签的有限内存
- 安全性可灵活调整:可以通过修改自定义字符表、更换更长的密钥、增加固定偏移量等方式提升混淆强度,只要密钥和自定义字符表不泄露,用户无法推导原始ID
- 长度可控:如果后续ID范围扩大,仅需调整补位长度即可,比如2^32范围的ID转62进制仅需6位字符串
内容的提问来源于stack exchange,提问作者Alberto
相关产品推荐
相关产品推荐

