Удобочитаемый GUID - PullRequest
       48

Удобочитаемый GUID

10 голосов
/ 18 декабря 2009

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

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

  1. Некоторый уровень читабельности для человека с точки зрения длины и содержания, чтобы предотвратить недовольство пользователя и ошибку при вводе данных.
  2. Учитывая один код ваучера, нетривиально угадать другой код ваучера.

Если я использую GUID, меня беспокоит пункт 1. Если я использую возрастающее целое число, меня беспокоит пункт 2. Между ними должен быть какой-то счастливый посредник, верно? Я подумал, что, возможно, эта работа уже выполнена, и меня ждет идеальное решение. В отсутствие этого я думаю, что я пойду со случайной буквенно-цифровой строкой или, возможно, только буквами (исключая I и O для ясности), и получу IP-адреса блока приложения, которые не пройдут X раз, что указывало бы возможная атака грубой силы. Если бы я пошел с этим, сколько длины строки и какое значение X будет работать и почему?

Спасибо за вашу помощь!


Обновление: у меня не было полной ясности в отношении метода: я буду генерировать списки кодов ваучеров для печати, а затем вводить «проданные» коды после концерта. Поэтому я думаю, что такие элементы, как контрольная сумма, не нужны, как в программных ключах, которые не используют серверы проверки.

Ответы [ 12 ]

9 голосов
/ 18 декабря 2009

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

5 голосов
/ 18 декабря 2009

Я бы использовал вашу собственную схему кодирования. В дополнение к пропуску I и O, для оптимальной читабельности также неплохо бы исключить все буквы, кроме одной, из множеств почти-омонимов (C / E, M / N) и многосложных букв, таких как W, и, конечно, придерживаться один случай.

Что касается длины, вы можете использовать 60 бит плюс 4-битную контрольную сумму. 64 бита достаточно, чтобы хранить время с точностью до миллисекунды в течение нескольких тысяч лет, поэтому для всех практических целей это невозможно угадать. Скажем, 4 бита на букву, это 16 букв в длину. Даже половина этой длины, вероятно, достаточно.

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

4 голосов
/ 18 декабря 2009

AOL использовал случайную комбинацию двух слов для CD, которые они отправили. Вы можете использовать тот же подход и просто увеличить количество слов, чтобы получить требуемые коэффициенты.

4 голосов
/ 18 декабря 2009

Только 8 буквенно-цифровых букв (кроме I и O) имеют 1785793904896 возможных комбинаций. Это для всех намерений и целей, которые невозможно угадать, если у вас нет 5 миллиардов ваучеров.

3 голосов
/ 18 декабря 2009

Что ж, если вы действительно хотите, чтобы человек читался, вы можете использовать BubbleBabble . Создайте скрипт на Perl, как показано ниже:

#!/usr/bin/perl
use Digest::BubbleBabble qw(bubblebabble);
use Digest::SHA1 qw(sha1);
print bubblebabble(Digest => sha1(join(' ', @ARGV))), "\n";

Затем введите любой аргумент командной строки, который вы хотите получить, как показано ниже:

xogan-nydut-zogiv-kotyn-ledah-taseb-gyhib-tucel-vudul-mykom-mexax

Или, если Perl не является вашим предпочтением, вы можете использовать режим произносимого пароля APG ( также доступен онлайн ), чтобы получить такой вывод:

BedHiv
cotsEub
AvRabinn
rarcUs
TeuvVarn
yuwats

Честно говоря, этот уровень читабельности человека является чрезмерным; Ответ RickNZ должен работать очень хорошо (и довольно близко к тому, что мы сделали для некоторых программных ключей). Но BubbleBabble - это весело.

2 голосов
/ 18 декабря 2009

Вероятно, лучше избегать всех гласных [*], тем самым избегая всех ругательств.

[*] Включая W, если вы валлиец!

2 голосов
/ 18 декабря 2009

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

Легко производить, не легко угадать новый (только для краткосрочного использования)

int i = 61234;
int j = rand()%99999
long GUID = i * j;

даст вам номер телефона с длиной GUID

только 99999 использует! DOH

2 голосов
/ 18 декабря 2009

5 блоков по 5 символов в каждом должно быть достаточно - четыре блока для «ключа», пятый в качестве контрольной суммы для обеспечения достоверности. И, конечно же, не используйте все пространство клавиш.

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

1 голос
/ 18 декабря 2009

Почему бы просто не пойти с GUID, а затем заменить любые сомнительные символы другой буквой (поэтому 0 становится 'h', 1 - 'q' и т. Д.)

1 голос
/ 18 декабря 2009

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

Они дают вам адрес электронной почты. Вы пишете GUID (со ссылкой). Они нажимают на ссылку и получают песню. Использование GUID зарегистрировано в системе и больше не будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...