Создание большого количества случайных последовательных ключей

Я разрабатываю приложение, в котором пользователь аутентифицируется только в том случае, если он вводит серийный ключ правильно. Этот серийный ключ совпадает с серийным ключом, уже присутствующим в базе данных. Этот серийный ключ должен состоять из 6 цифр и 3 алфавитов. Пользователи получают этот ключ в письменной форме от меня.

Как я могу генерировать большое количество (100 000 000 приблизительно) серийных ключей?

0
nl ja de
Как пользователи получают ключи?
добавлено автор Henry, источник
добавление контрольной суммы сделает ее менее безопасной (меньше ключей, чтобы попробовать)
добавлено автор Henry, источник
Насколько высока «безопасность» на клавишах? Если не считать контрольной суммы, злоумышленник должен будет генерировать ~ 176 ключей в среднем, чтобы правильно угадать. Достаточно хорошо?
добавлено автор Joachim Isaksson, источник
они получают в письменной форме
добавлено автор Gagan Deep, источник
Мне нужно это с высокой степенью безопасности с контрольной суммой.
добавлено автор Gagan Deep, источник
я могу пойти с несколькими клавишами
добавлено автор Gagan Deep, источник

2 ответы

На мой взгляд, самый простой способ:

  1. find a desired number in range [1,10000000), let it be x and it will represent your 6 digits.
  2. Find 3 characters (let's assume in range a-z). Let them be a,b,c.
  3. Your number is (a-'a' + b-'a'*26 + c-'a'*26*26)*10000000 + x

(Где 'a' - это ascii-представление символа 'a' , а a-'a 'означает числовое вычитание ascii)

Обратите внимание, что сгенерированное число может даже вписываться в long - при условии, что это 64 бит.


Поколение нескольких чисел можно просто выполнить с помощью итерации, начиная с a = b = c = 'a' и x = 0 , и начать продвигаться (увеличиваться на 1) , Когда вы достигли x = 10000000 , увеличьте, если a передано z - увеличение b , .... (похоже на то, что вы сделали бы в нормальном целочисленном арифметике).

0
добавлено
@GaganDeep: Нет, это последовательный (я не понял, что вы случайно). Чтобы получить случайный вариант, можно итеративно создавать разные значения для x, a, b, c и поддерживать набор, чтобы проверить, доступны ли эти значения.
добавлено автор amit, источник
это случайный? это похоже на последовательность, которую легко предсказать.
добавлено автор Gagan Deep, источник

Для генерации ключей вы можете использовать защищенный генератор случайных чисел, например SecureRandom .

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

0
добавлено
С помощью SecureRandom вы можете генерировать достаточно случайные байты, которые вы можете преобразовать в ключ, который выглядит так, как вы его описали. Например, как Амит описал это в своем ответе. Если вам нужна более высокая безопасность, сделайте ключ более длинным.
добавлено автор Henry, источник
поэтому для чего это решение?
добавлено автор Gagan Deep, источник