我需要为用户提供一个包含其USER ID
的唯一链接(在这种情况下,请不要建议使用UUID等)
这并不重要,但我还是要确保提取用户ID或猜测下一个ID十分困难! (即使它是通过默默无闻的安全性实现的……)
我想出了这个解决方案:
// @var $id int|string
function obfuscate_number($id, bool $reverse=FALSE)
{
$changing = (int)substr($id, -1);
$multiplier = '45' . $changing;
$base = 25;
// Obfuscate Number
if($reverse === FALSE)
{
$new = bcmul("$id", "$multiplier", 0);
$convert = bcadd("$new", "$changing", 0);
$obf = base_convert($convert, 10, $base) . $changing;
return $obf;
}
// Reverse to Number
else
{
$deobf = base_convert(substr($id, 0, -1), $base, 10);
$convert = bcsub("$deobf", "$changing", 0);
// Simple Validation
if($convert % $multiplier !== 0) return FALSE;
$number = (int)bcdiv("$convert", "$multiplier", 0);
return $number;
}
}
// For example number 123456 => 5dnpfi6
// After reversing 5dnpfi6 => 123456
// For example number 563 => g81h3
// After reversing g81h3 => 563
如果可能,请帮助我进行改进。
我还认为这里的碰撞几率是0,对吗?
答案 0 :(得分:0)
散列,散列允许您将散列发送出去,并且在没有非常适度的计算量的情况下,不会将其倒置为用户ID。服务器会进行哈希处理,将字符串发送给客户端,客户端访问网页,然后您在某种与用户ID相匹配的哈希表中查找数据库。
使用AES加密将使您可以加密数据,如果您遵循AES准则,通常可以保证这些数据不会损坏。因此,一种方法是使用AES加密数据并将其转换为base64。将base64发送给用户,当用户单击链接时,您只需要将base 64转换为二进制文件并解密即可。我想说这比散列方法要快得多。