2008-08-29 2 views
13

Несколько месяцев назад мне было поручено внедрить уникальный и случайный код для нашего веб-приложения. Код должен быть удобным для пользователя и как можно меньше, но по-прежнему быть практически случайным (поэтому пользователи не могли легко предсказать следующий код в последовательности).Как я могу создать уникальный, маленький, случайный и удобный ключ?

Это в конечном итоге генерации значений, которые выглядели примерно так:

Af3nT5Xf2 

К сожалению, я никогда не был удовлетворен реализацией. Руководство не могло быть и речи, они были просто слишком большими и трудными для пользователей. Я надеялся на что-то большее по строкам из 4 или 5 символов/цифр, но наша конкретная реализация создавала бы заметные последовательности с рисунком, если мы закодировали до менее 9 символов.

Вот что мы в конечном итоге делает:

Мы тянули уникальный последовательный 32-битный идентификатор из базы данных. Затем мы вставили его в центральные биты 64-битного числа RANDOM. Мы создали таблицу поиска легко типизированных и распознанных символов (A-Z, a-z, 2-9, пропускающих легко запутанные символы, такие как L, l, 1, O, 0 и т. Д.). Наконец, мы использовали эту таблицу поиска для base-54 для кодирования 64-разрядного целого числа. Высокие биты были случайными, младшие разряды были случайными, но центральные биты были последовательными.

Конечным результатом был код, который был намного меньше, чем ориентир, и выглядел случайным, хотя его абсолютно не было.

Я не был доволен этой конкретной реализацией. Что бы вы, ребята, сделали?

+1

Зачем вам последовательное значение? Вы вернулись к нему? Если да, используйте криптографическую функцию для шифрования вашего секретного номера с помощью секретного ключа и кодирования шифрования с помощью алфавита по вашему выбору. – Oli 2008-10-03 11:42:00

ответ

3

В C# я использовал метод «System.IO.Path.GetRandomFileName() : String» ... но я генерировал соль для имен файлов отладки. Этот метод возвращает материал, похожий на ваш первый пример, за исключением случайного расширения файла .xyz.

Если вы в .NET и просто хотите более простое (но не более привлекательное) решение, я бы сказал, что это ... вы можете удалить произвольное расширение файла, если хотите.

3

В .NET вы можете использовать метод RNGCryptoServiceProvider GetBytes(), который «заполнит массив байтов криптографически сильной последовательностью случайных значений» (из документации ms).

byte[] randomBytes = new byte[4]; 
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); 
rng.GetBytes(randomBytes); 

Вы можете увеличить lengh массива байтов и вырвать значения символов, которые вы хотите разрешить.

7

Вот как я это сделаю.

Я бы получил список распространенных английских слов с частотой использования и некоторой грамматической информацией (например, это существительное или глагол?). Я думаю, что вы можете осмотреть межтрубки для какой-то копии. Firefox является открытым исходным кодом, и у него есть проверка орфографии ... поэтому его нужно каким-то образом получить.

Затем я запустил фильтр на нем, так что неясные слова удалены, а слова, которые слишком длинные, исключены.

Тогда алгоритм моего поколения выбрал бы 2 слова из списка и объединил их и добавит случайный 3-значный номер.

Я могу также рандомизации шаблон выбора слова между глаголом/существительными, как

eatCake778
pickBasket524
rideFlyer113 и т.д ..

случай не должен быть верблюд корпус, вы также можете рандомизировать это. Вы также можете рандомизировать размещение номера и глагола/существительного.

И так как это много случайных чисел, то Jeff's The Danger of Naïveté является обязательным для чтения. Также обязательно изучите словарные атаки заблаговременно.

И после того, как я его осуществил, я проведу тест, чтобы убедиться, что мои алгоритмы никогда не сталкиваются. Если частота столкновений была высокой, я бы играл с параметрами (количество используемых существительных, количество используемых глаголов, длина случайного числа, общее количество слов, различные виды обсадных труб и т. Д.)

+0

Обычные английские слова не подходят для сайта, подобного тинюрлу. Вы более подробно описываете генератор паролей IMO. – dfrankow 2009-08-24 19:51:10

0

Если пользователь дружелюбный, вы имеете в виду, что пользователь может набрать ответ, тогда я думаю, что вы захотите посмотреть в другом направлении. Я видел и выполнял реализации для начальных случайных паролей, которые выбирают случайные слова и числа как более легкую и менее подверженную ошибкам строку.

Если вы ищете способ кодирования случайного кода в строке URL-адреса, которая является проблемой, с которой я справлялся некоторое время, то я сделал то, что я сделал, это использование идентификаторов GUID с 64-битным кодированием.

0

Вы можете загрузить свой список слов в виде chakrit в таблицу данных или XML-файл с уникальным последовательным ключом. Когда вы получаете свое случайное слово, используйте генератор случайных чисел, чтобы определить, какие слова извлекать по их ключу. Если вы соедините 2 из них, я не думаю, что вам нужно включать числа в строку, если только «истинная случайность» не является частью цели.

Смежные вопросы