Является ли это хорошим подходом к идентификатору пользователя «Obfuscate»? - PullRequest
0 голосов
/ 05 мая 2019

Мне нужно предоставить пользователям уникальную ссылку, содержащую их USER ID (в этом случае не рекомендуется использовать UUID и т. Д.)

Это не так важно, но я все же хочу убедиться, что очень трудно извлечь идентификатор пользователя или угадать следующий и т. Д.! (даже если это достигается безопасностью по неизвестности ...)

Я придумал это решение:

// @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 голосов
/ 05 мая 2019

Возможные решения

Медленное

Хеширование, хеширование позволит вам отправить хеш, и без чрезвычайно умеренного количества вычислений не будет преобразовано в идентификатор пользователя. Сервер хеширует, отправляет строку клиенту, клиент посещает веб-страницу, вы ищете в базе данных какой-то хеш-код, совпадающий с идентификатором пользователя.

Быстро (рекомендуется)

Использование шифрования AES позволит вам шифровать данные, которые, как правило, гарантированно не будут взломаны, если вы будете следовать рекомендациям AES. Таким образом, подход заключается в том, чтобы зашифровать данные с помощью AES и преобразовать в базу 64. Отправьте пользователю base64, а когда пользователь щелкнет ссылку, вам просто нужно преобразовать базу 64 в двоичную и расшифровать. Я бы сказал, что это значительно быстрее, чем метод хеширования.

...