Какова математика промо-кодов Google Adwords и как их воспроизвести в пользовательском приложении?

#algorithm #math #promotion-code

#алгоритм #математика #промо-код

Вопрос:

недавно я увидел, что Google AdWords делится промо-кодами, что дает вам 200 долларов за публикацию с ними.

Вопрос в следующем: очевидно, что код представляет собой большую комбинацию символов, что-то вроде: 9842 - a251 - b51s - 1250 , и если вы попытаетесь ввести любой другой ввод, кроме того, что они выдают, он не сможет сообщить вам, что код недействителен. Это, конечно, хорошо, потому что вы не хотите, чтобы какой-либо «робот» генерировал ваши коды для вас.

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

Знаете ли вы, как это правильно делается?

Спасибо вам всем!

Ответ №1:

Самый безопасный способ сделать это — использовать криптографический PRNG для генерации достаточно длинного случайного кода (в идеале не менее 128 бит) и сохранить список допустимых идентификаторов в базе данных. Когда кто-то вводит код, сверьте его с базой данных и пометьте как использованный.

Комментарии:

1. Спасибо @Nick. Я понятия не имею, о чем вы говорите, но я начну читать об этом.

Ответ №2:

Самый простой способ:

  1. задайте алфавит

    string alpha = "0123456789abcdefghijklmnopqrstuvwxyz";

  2. задайте длину конечного кода

    int final = 16; string code="";

  3. генерировать символы из алфавита

.

 int i = final;
while( i-->0 ){
string  = alpha[ Math.random(0,alpha.length) ]
}
  

Комментарии:

1. вы можете добавить механизм, чтобы избежать коллизии: объединить один номер auto-inc в конце: 0001-asbe-4524-aa3g

2. У вас могут возникнуть коллизии с этим алгоритмом. Повторяющиеся символы тоже.

3. ДА. вы можете получить несколько копий символа. Случайность хороша тем, что вообще не избегает никаких комбинаций.

4. @santiagobasulto При достаточно длинном числе коллизии настолько маловероятны, что их можно игнорировать. Тем не менее, вы должны использовать криптографический PRNG.

5. Спасибо @robermorales Это хорошая идея добавлять автоинкрементные номера, чтобы избежать коллизий.

Ответ №3:

Возьмите хэш номера автоматического включения, объединенного с фиксированной строкой:

«Моя длинная бессмысленная строка 0000001»

«Моя длинная бессмысленная строка 0000002»

Хэши хороши для генерации сильно отличающихся кодов из почти идентичных строк. Выбросьте дубликаты, если они у вас есть.

Комментарии:

1. Потрясающе! Если вы использовали обычную хэш-функцию, такую как SHA1, теперь я могу взять ваш хэш и расширить его произвольными символами, создавая столько допустимых кодов, сколько захочу. Используйте HMAC, а не просто конкатенацию строк.

2. «Ник: Разве вам не нужно знать мою фиксированную строку (которая эквивалентна закрытому ключу) для создания действительных кодов? Но вы правы, конечно, использование асимметричного шифрования повысит безопасность до известного уровня.

3. Нет — связанные блочные хэш-функции, такие как SHA1, уязвимы для атак расширений — учитывая хэш для короткой строки, я могу вычислить хэш для строки, для которой это префикс, без необходимости знать, какой была исходная строка. HMAC — это не асимметричная криптография — это просто безопасный способ использования хэшей для создания того, что вы пытаетесь создать здесь.

4. Тогда я не понимаю, как вы можете создавать действительные ключи. Все строки имеют одинаковую длину, хэши, созданные более длинными строками, недопустимы. Чтобы сделать то, что вы говорите, вам нужно знать хэш для «Моей длинной бессмысленной строки», но у вас есть только хэш для «Моей длинной бессмысленной строки 0000001».

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