Генерация уникального * и * случайного 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(), но я думаю, что все, что этот метод делает, это генерирует случайный массив байтов ихранить это вGuid структура данных. Другими словами, этобольше не гарантируется быть уникальным, этоs гарантированно будет случайным.

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

Вопросы

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

Должен ли я просто создать свой URL путем объединения уникальной строки со случайной строкой?

Есть ли в .NET Framework встроенный способ легко генерировать уникальныеа также случайная (непредсказуемая) последовательность, которую можно использовать для URL?

Если нет, то есть ли хорошее решение с открытым исходным кодом?

Обновить

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

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;
    }
}

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

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

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