Генерация уникального * и * случайного URL в C #

Моя конечная цель - создать уникальный URL-адрес, который невозможно угадать / предсказать. Назначение этого URL-адреса состоит в том, чтобы позволить пользователям выполнять такие операции, как проверка адреса электронной почты и сброс пароля. Срок действия этих URL истекает через установленное время (в настоящее время установлено 24 часа).

Я изначально использовалGuid для этой цели, но теперь я понимаю, что это где-то между "просто отлично" и "очень небезопасно" в зависимости от того, какого эксперта вы слушаете. Итак, я подумал, что немного расширил свой код, на всякий случай. Сначала я подумал, что просто придерживаюсьGuid, но генерировать его из случайных байтов, а неGuid.NewGuid() заводской метод. Вот метод, который я придумал:

public static Guid GetRandomGuid()
{
    var bytes = new byte[16];
    var generator = new RNGCryptoServiceProvider();
    generator.GetBytes(bytes);
    return new Guid(bytes);
}

Я не совсем понимаю, что именно происходит, когда вы используетеnew Guid(bytes) вместоGuid.NewGuid(), но я думаю, что все, что этот метод делает, это генерирует случайный массив байтов иstore это вGuid структура данных. Другими словами, он больше не гарантированно является уникальным, он только гарантированно будет случайным.

Поскольку мои URL должны быть уникальнымиand случайно, это не похоже на твердое решение. Я сейчас думаю, что мои URL должны основываться на комбинации обоих уникальных идентификаторов (которые могут бытьGuid или, если возможно, автоматически увеличенный идентификатор базы данных) и случайная последовательность, сгенерированная изRNGCryptoServiceProvider.

Questions

Каков наилучший способ создания URL подтверждения / сброса пароля, который гарантированно уникален и чрезвычайно труден / невозможен для прогнозирования / угадывания?

Should I simply construct my URL by concatenating a unique string with a random string?

Does the .NET Framework have a built-in way to easily generate a unique and random (unpredictable) sequence that can be used for URLs?

If not, is there a good solution available open source?

Update

Если у кого-то есть подобное требование, я в настоящее время использую следующий метод:

public static string GenerateUniqueRandomToken(int uniqueId)
    // generates a unique, random, and alphanumeric token
{
    const string availableChars =
        "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    using (var generator = new RNGCryptoServiceProvider())
    {
        var bytes = new byte[16];
        generator.GetBytes(bytes);
        var chars = bytes
            .Select(b => availableChars[b % availableChars.Length]);
        var token = new string(chars.ToArray());
        return uniqueId + token;
    }
}

Пожалуйста, прокомментируйте, если вы видите какие-либо проблемы с этим.

Ответы на вопрос(4)

Ваш ответ на вопрос