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

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

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

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

электронная почта + основной алгоритм хэширования:

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

Идентификатор:

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

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

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

проверка:

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

Ответы [ 2 ]

3 голосов
/ 03 января 2011

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

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

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

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

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

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

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

...