我需要一种简单的方法来混淆数据库中自增主键,当它们在 URI 或 API 调用中对用户可见时。用户不应该能够递增 URL 中的 ID 并查看数据库表中的下一个数据记录。
我的解决方案(使用 Tom 修改后的 base64 函数)
函数 base64url_encode($plainText) {
$base64 = base64_encode($plainText);
$base64url = strtr($base64, '+/=', '-_,');
返回 $base64url;
}
函数 base64url_decode($plainText) {
$base64url = strtr($plainText, '-_,', '+/=');
$base64 = base64_decode($base64url);
返回 $base64;
}
函数 encryptId($int, $class='') {
返回 base64url_encode($int.'-'.substr(sha1($class.$int.encryptionKey), 0, 6));
}
函数 decryptId($string, $class='') {
$parts = explode('-', base64url_decode($string));
如果 (count($parts) != 2) {
返回 0;
}
$int = $parts[0];
返回 substr(sha1($class.$int.encryptionKey), 0, 6) === $parts[1]
? (int)$int
: 0;
}
- 可选的第二个参数是类名,因此不同表的两个相同 ID 不会产生两个相同的混淆 ID。
- encryptionKey 是一个用于加密的全局密钥。
- decryptId() 检查 base64 编码字符串的第二部分是否正确。