Я пишу маленькую систему, которая позволит мне продавать музыку своей полосы на концертах путем генерации ваучеров, которые могут быть выплачены для MP3s в нашем веб-сайте.
Для ваучеров будет нужен код, который вводит пользователь. Код должен иметь следующие качества:
Если я использую GUID, я обеспокоен точкой 1. Если я использую целое число постепенного увеличения, я обеспокоен точкой 2. Должна быть некоторая промежуточная золотая середина, правильно? Я думал, возможно, что эта работа была уже сделана и существует идеальное решение, ожидающее там меня. В отсутствие этого я думаю, что пойду со случайной алфавитно-цифровой строкой или возможно обозначаю буквами только (исключая I и O для ясности), и имейте IP-адреса блока приложений, которые приводят к сбою X количества раз, которое указало бы на возможную атаку перебором. Если я пошел с этим, сколько времени из строки и какое значение X будет работать, и почему?
Спасибо за помощь!
Обновление: Я не был полностью явным о методе: Я генерирую списки оправдательных кодов для печати, затем ввести "проданные" коды после концерта. Поэтому я думаю, что элементы как контрольная сумма не необходимы как, они находятся в программных ключах, которые не используют серверы проверки.
Только 8 буквенно-цифровых букв (кроме I и O) имеют 1785793904896 возможных комбинаций. Это невозможно для любых намерений и целей, пока у вас нет 5 миллиардов ваучеров.
Вы можете использовать цепочку Маркова, обученную английским слогам, чтобы создать предложение, состоящее из произносимой тарабарщины слова. Просто добавьте сгенерированное предложение в базу данных действительных ваучеров при их распечатке (и, конечно же, аннулируйте их при погашении).
Я бы использовал вашу собственную схему кодирования. Помимо исключения I и O, для оптимальной читаемости также неплохо исключить все буквы, кроме одной, из наборов, близких к омонимам (C / E, M / N) и многосложных букв, таких как W, и, конечно, придерживаться один случай.
Что касается длины, вы можете использовать 60 бит плюс 4-битная контрольная сумма. 64 бита достаточно, чтобы сохранить время до миллисекунды с точностью до нескольких тысяч лет, поэтому для всех практических целей это невозможно определить. Скажем, 4 бита на букву, это 16 букв. Даже половина этой длины, вероятно, вполне достаточна.
Другой способ представить это - автомобильные номерные знаки: 3 буквы и 3 цифры достаточно, чтобы покрыть довольно большой штат, и, как правило, хорошо читаются. Если вы не предоставите возможность кому-то взламывать коды на высокой скорости, они определенно выиграют ».
Используется AOL. использовать случайную комбинацию двух слов для разосланных компакт-дисков. Вы можете использовать тот же подход и просто увеличить количество слов, чтобы получить нужные вам шансы.
5 блоков по 5 символов в каждом должно быть достаточно - четыре блока для «ключа», пятый - в качестве контрольной суммы для обеспечения достоверности. И, конечно же, не используйте все пространство клавиш.
Во всяком случае, примерно так выглядят серийные номера программ.
Что ж, если вы действительно хотите, чтобы ее читал человек, вы можете использовать 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 - это своего рода развлечение.
Вероятно, лучше всего избегать всех гласных [*], избегая, таким образом, всех ругательств.
[*] Включая W, если вы валлийский!
хм, я не знаю, как работает большинство систем, но я думаю, что было бы аккуратно и просто определить статическое число и умножить это число на другое случайное число. Тогда, если большой GUID кратен вашему статическому, вы в порядке.
Легко создать, нелегко угадать новый (только для краткосрочного использования)
int i = 61234;
int j = rand()%99999
long GUID = i * j;
даст вам только GUID длины телефонного номера
99999 использует хотя! дох
Одно из простых решений - вызвать метод getHashCode, который есть в строковых типах большинства языков. Установите строку на какое-нибудь слово из вашего списка одобренных слов. Затем вызовите gethashcode, и это будет ваш ключ. Чтобы проверить это, сравните его со списком существующих хэшей слов и, возможно, удалите его из списка, чтобы его нельзя было использовать снова.
Я предполагаю, что вы получаете адрес электронной почты, когда они приобретите ваучер (необходимо). Если так, почему бы просто не отправить им одноразовый GUID по электронной почте? Таким образом, и у вас, и у них есть запись об этом, вы можете отслеживать погашения, вы не рискуете угадать (или, по крайней мере, не стоит беспокоиться), пользователю не нужно ничего запоминать, потому что это есть в электронное письмо, и вам не нужно ничего кодировать.
Они дают вам адрес электронной почты. Вы пишете по электронной почте GUID (со ссылкой). Они переходят по ссылке и получают песню. Использование GUID зарегистрировано в системе и больше не будет работать.
Почему бы просто не использовать GUID, а затем заменить все сомнительные символы другой буквой (так, что 0 становится «h», 1 - «q» и т. Д.).
вы можете попробовать что-нибудь вроде генератора случайной последовательности букв? . Вы также можете смешивать и сочетать буквы и цифры