Я мозговой штурм для схемы серийных номеров. Я делаю это неправильно?

Формат серийного номера:

  • 24 октета представлены 24 шестнадцатеричными символами плюс дефисы для удобства чтения
  • например, D429-A7C5-9C15-8516-D15D-3A1C

    • 0-15: {электронная почта + главный хэш}
    • 16-19: {id}
    • 20-23: {отметка времени}

Email+ основной алгоритм хэширования:

  • генерировать md5 хэш электронной почты пользователя (32 байта)
  • генерировать хэш md5 нераскрытого мастер-ключа
  • xor эти два хэша
  • удалить лишние байты, уменьшив размер до 16
  • например, D429A7C59C158516D15D3A1CB00488ED -> D2AC9181D531B08E

Я бы:

  • изначально 0x00000000, затем увеличивается с каждой проданной лицензией

отметка времени:

  • временная метка, генерируемая при покупке лицензии

Проверка:

  • для регистрации продукта пользователь должен ввести 1) адрес электронной почты и 2) серийный номер
  • сгенерируйте email+ мастер-хеш и убедитесь, что он соответствует 0-15 серийного номера
  • извлеките метку времени из серийного номера и убедитесь, что она <текущая метка времени и>= дата первой продажи лицензии

2 ответа

Решение

Я не эксперт в этом, но есть несколько вещей, которые могут быть проблематичными при таком подходе:

  1. Использование MD5 не кажется хорошей идеей. MD5 имеет слабые места в безопасности, и кто-то, у кого достаточно времени, может легко столкнуться с каким-либо хеш-конфликтом. В зависимости от того, как вы используете серийный номер, кто-то может легко подделать серийный номер, который выглядит так, как будто он совпадает с другим серийным номером. Использование чего-либо из семейства SHA может предотвратить это.
  2. Ваш XOR хэша электронной почты пользователя с главным ключом не особенно безопасен - я мог легко восстановить хэш главного ключа, XOR серийный номер с помощью хэша моей собственной электронной почты.
  3. Удаление каждого лишнего байта из безопасного хэша нарушает гарантию того, что хеш является безопасным. В частности, любая хеш-функция с хорошей гарантией безопасности обычно требует, чтобы все выходные байты в результирующем хеш-коде присутствовали в выходных данных. В качестве примера, я мог бы тривиально построить защищенную хеш-функцию из любой существующей защищенной хеш-функции, взяв выходные данные этого первого хеша, перемежая 0 с между всеми старыми байтами, а затем выведя результат. Это безопасно, потому что если бы вы могли сломать любое из свойств безопасности моего нового хэша, это было бы эквивалентно нарушению свойств безопасности исходного хэша. Однако, если вы отбросите все четные байты из нового хэша, вы получите все нули, которые совсем не защищены.
  4. Достаточно ли четырех байтов для идентификатора? Это дает только 2^32 разных идентификаторов.

Некоторые моменты, которые нужно добавить к ответу templatetypedef:

  1. Если вам необходимо объединить хэши для электронной почты и вашего мастер-ключа, хэшируйте конкатенацию обоих. Более того, хеш-адрес электронной почты + ключ + идентификатор для еще более "лучшей" безопасности на случай, если кто-то купит две или более лицензий и увидит шаблон.

  2. Используйте хеш-функцию, которая дает вам только 16 байтов. Если вы должны использовать MD5, любое усечение одинаково плохо, поэтому просто возьмите первые 16 байтов.

  3. Ваш идентификатор никогда не используется в проверке.

  4. Вы не будете защищены от обмена ключами (например, с сайтов Warez).

Серийный номер защищает вас от очень немногих атак. Это, вероятно, не стоит вашего времени и усилий.

Другие вопросы по тегам