Как я могу генерировать уникальные непоследовательные серийные ключи без стороннего программного обеспечения? - PullRequest
15 голосов
/ 03 октября 2011

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

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

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

Мне нужен простой алгоритм, который может принимать последовательные числа и генерировать уникальные непоследовательные ключи из 16-20 буквенно-цифровых символов.

UPDATE

SHA-1 выглядит наилучшим образом. Однако из примера вывода ключей SHA-1 видно, что они довольно длинные (40 символов). Получу ли я достаточно результатов, если беру ключ 40 символов и, скажем, усекаю все, кроме последних 16 символов?

Ответы [ 3 ]

13 голосов
/ 03 октября 2011

Вы можете просто объединить серийный номер устройства, имя / код функции и некоторую секретную соль и хешировать результат с помощью SHA1 (или другого алгоритма безопасного хеширования). Устройство сравнивает данный хеш с хешем, сгенерированным для каждой функции, и, если оно находит совпадение, оно активирует эту функцию.

Кстати, чтобы уменьшить количество символов, я бы предложил использовать base64 в качестве кодировки после прохода хеширования.

SHA-1 выглядит наилучшим образом. Однако из примера вывода ключей SHA-1 видно, что они довольно длинные (40 символов). Получу ли я достаточные результаты, если беру результат с 40 символами и, скажем, усекаю все, кроме последних 16 символов?

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

Hex:    a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
Base64: qUqP5cyxm6YcTAhz05Hph5gvu9M

--- редактировать ---

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

Вам также следует использовать HMAC вместо того, чтобы наивно добавлять или добавлять ключ к хешу. В Википедии:

Разработка спецификации HMAC была мотивирована существованием атаки на более тривиальные механизмы объединения ключа с хешем функция. Например, можно принять ту же безопасность, что и HMAC обеспечение может быть достигнуто с MAC = H (ключ ∥ сообщение). Тем не менее, это Метод страдает серьезным недостатком: с большинством хеш-функций он легко добавлять данные в сообщение, не зная ключа и получить другой действительный MAC. Альтернатива, добавление ключа с помощью MAC = H (сообщение ∥ ключ), страдает от проблемы, что злоумышленник, который может найти коллизию в хеш-функции (без ключа) имеет коллизию в MAC. Использование MAC = H (ключ ∥ сообщение ∥ ключ) лучше, но разнообразно службы безопасности предположили уязвимости с этим подходом, даже когда используются два разных ключа.

Подробнее о последствиях для безопасности для этого и усечения длины см. В разделах 5 и 6 RFC2104 .

2 голосов
/ 03 октября 2011

Один вариант - использовать хэш, как описывает Маттео.

Другой - использовать блочный шифр (например, AES).Просто выберите случайный одноразовый номер и вызовите шифр в режиме счетчика , используя ваши серийные номера в качестве счетчика.

Конечно, это сделает ключи обратимыми, что может быть или не быть желательнымсвойство.

0 голосов
/ 03 октября 2011

Вы можете использовать генератор случайных чисел *1001* *1001* для генерации уникального 64-битного ключа, а затем кодировать этот ключ, используя любую схему, какую захотите. Если вы используете base-64, длина ключа составляет 11 символов. Если вы используете шестнадцатеричное кодирование, длина ключа будет 16 символов.

Xorshift RNG - это просто битовый микшер, и есть версии с гарантированным периодом 2 ^ 64, что означает, что он гарантированно генерирует уникальное значение для каждого входа.

Другой вариант - использовать сдвиговый регистр с линейной обратной связью, который также будет генерировать уникальный номер для каждого отдельного входа.

...