Как я могу создать уникальный, маленький, случайный и удобный ключ?
Несколько месяцев назад мне было поручено внедрить уникальный и случайный код для нашего веб-приложения. Код должен быть удобным для пользователя и как можно меньшим, но по-прежнему быть практически случайным (поэтому пользователи не могли легко предсказать следующий код в последовательности).
Это привело к созданию значений, которые выглядели примерно так:
Af3nT5Xf2
К сожалению, я никогда не был доволен реализацией. Руководство не могло быть и речи, они просто слишком велики и трудны для ввода пользователем. Я надеялся на что-то большее по строкам из 4 или 5 символов/цифр, но наша конкретная реализация создавала заметные последовательности с рисунком, если мы закодировали до менее 9 символов.
Вот что мы закончили:
Мы вытащили уникальный уникальный 32-битный идентификатор из базы данных. Затем мы вставили его в центральные биты 64-битного числа RANDOM. Мы создали таблицу поиска легко типизированных и распознанных символов (A-Z, a-z, 2-9, пропускающих легко запутанные символы, такие как L, l, 1, O, 0 и т.д.). Наконец, мы использовали эту таблицу поиска для base-54 для кодирования 64-разрядного целого числа. Высокие биты были случайными, младшие разряды были случайными, но центральные биты были последовательными.
Конечным результатом был код, который был намного меньше, чем ориентир, и выглядел случайным, хотя это абсолютно не было.
Я не был доволен этой конкретной реализацией. Что бы вы, ребята, сделали?
Ответы
Ответ 1
Вот как бы я это сделал.
Я бы получил список общих английских слов с частотой использования и некоторой грамматической информацией (например, это существительное или глагол?). Я думаю, что вы можете осмотреть межтрубки для какой-то копии. Firefox является открытым исходным кодом, и у него есть проверка орфографии... поэтому его нужно каким-то образом получить.
Затем я запустил фильтр на нем, так что неясные слова удалены и слишком длинные слова исключены.
Тогда алгоритм моего поколения выберет 2 слова из списка и объединит их и добавит случайный 3-значный номер.
Я также могу рандомизировать шаблон выбора слов между глаголами/существительными, такими как
eatCake778
pickBasket524
rideFlyer113 и т.д..
Случай не должен быть верблюжьим корпусом, вы также можете его рандомизировать. Вы также можете рандомизировать размещение номера и глагола/существительного.
И так как много рандомизации, Jeff The Danger of Naïveté является обязательным для чтения. Также обязательно изучите словарные атаки заблаговременно.
И после того, как я его осуществил, я проведу тест, чтобы убедиться, что мои алгоритмы никогда не сталкиваются. Если частота столкновений была высокой, я бы играл с параметрами (количество используемых существительных, количество используемых глаголов, длина случайного числа, общее количество слов, различные виды обсадных труб и т.д.).
Ответ 2
В С# я использовал метод System.IO.Path.GetRandomFileName(): String, но я был генерируя соль для отладочных имен файлов. Этот метод возвращает материал, который выглядит как ваш первый пример, за исключением случайного расширения файла .xyz.
Если вы в .NET и просто хотите более простое (но не "красивое" ) решение, я бы сказал, что это... вы могли бы удалить произвольное расширение файла, если хотите.
Ответ 3
В .NET вы можете использовать метод RNGCryptoServiceProvider GetBytes(), который "заполнит массив байтов криптографически сильной последовательностью случайных значений" (из документации ms).
byte[] randomBytes = new byte[4];
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
rng.GetBytes(randomBytes);
Вы можете увеличить длину байтового массива и вырвать значения символов, которые вы хотите разрешить.
Ответ 4
Если по удобству для пользователя, вы имеете в виду, что пользователь может набрать ответ, тогда я думаю, вы бы хотели посмотреть в другом направлении. Я видел и выполнял реализации для начальных случайных паролей, которые выбирают случайные слова и числа как более легкую и менее подверженную ошибкам строку.
Если вы ищете способ кодирования случайного кода в строке URL-адреса, которая является проблемой, с которой я справлялся некоторое время, то я сделал то, что использовал, используя 64-битные кодированные GUID.
Ответ 5
Вы можете загрузить список слов в виде chakrit, предложенного в таблицу данных или XML файл с уникальным последовательным ключом. Когда вы получаете свое случайное слово, используйте генератор случайных чисел, чтобы определить, какие слова извлекать по их ключу. Если вы соедините 2 из них, я не думаю, что вам нужно включать числа в строку, если только "истинная случайность" не является частью цели.