这是“混淆”用户ID的好方法吗?

时间:2019-05-04 22:03:53

标签: php math obfuscation

我需要为用户提供一个包含其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,对吗?

1 个答案:

答案 0 :(得分:0)

可能的解决方案

散列,散列允许您将散列发送出去,并且在没有非常适度的计算量的情况下,不会将其倒置为用户ID。服务器会进行哈希处理,将字符串发送给客户端,客户端访问网页,然后您在某种与用户ID相匹配的哈希表中查找数据库。

快速(推荐)

使用AES加密将使您可以加密数据,如果您遵循AES准则,通常可以保证这些数据不会损坏。因此,一种方法是使用AES加密数据并将其转换为base64。将base64发送给用户,当用户单击链接时,您只需要将base 64转换为二进制文件并解密即可。我想说这比散列方法要快得多。