Человекочитаемый GUID

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

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

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

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

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


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

11
задан James Orr 18 December 2009 в 04:23
поделиться

12 ответов

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

4
ответ дан 3 December 2019 в 02:10
поделиться

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

9
ответ дан 3 December 2019 в 02:10
поделиться

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

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

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

5
ответ дан 3 December 2019 в 02:10
поделиться

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

4
ответ дан 3 December 2019 в 02:10
поделиться

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

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

2
ответ дан 3 December 2019 в 02:10
поделиться

Что ж, если вы действительно хотите, чтобы ее читал человек, вы можете использовать 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 - это своего рода развлечение.

3
ответ дан 3 December 2019 в 02:10
поделиться

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

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

2
ответ дан 3 December 2019 в 02:10
поделиться

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

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

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

даст вам только GUID длины телефонного номера

99999 использует хотя! дох

2
ответ дан 3 December 2019 в 02:10
поделиться

Одно из простых решений - вызвать метод getHashCode, который есть в строковых типах большинства языков. Установите строку на какое-нибудь слово из вашего списка одобренных слов. Затем вызовите gethashcode, и это будет ваш ключ. Чтобы проверить это, сравните его со списком существующих хэшей слов и, возможно, удалите его из списка, чтобы его нельзя было использовать снова.

1
ответ дан 3 December 2019 в 02:10
поделиться

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

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

1
ответ дан 3 December 2019 в 02:10
поделиться

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

1
ответ дан 3 December 2019 в 02:10
поделиться

вы можете попробовать что-нибудь вроде генератора случайной последовательности букв? . Вы также можете смешивать и сочетать буквы и цифры

0
ответ дан 3 December 2019 в 02:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: