Безопасный алгоритм для создания лицензионных ключей?

Причина в том, что наиболее подходящим типом для счетчика этого типа является регулярное signed целое число, даже если этот счетчик никогда не станет ниже 0.

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

unsigned для C ++ не означает «целое число, которое не может быть отрицательным». Чтобы понять, почему это определение просто не имеет смысла, рассмотрим, что

  • Разница в два unsigned составляет unsigned
  • Добавление unsigned с signed unsigned
  • Значение unsigned никогда не превышает -1

Ничто из вышеперечисленного не имеет никакого смысла, если считать unsigned значением «неотрицательный» ».

Использование unsigned для size_t было ошибкой (см., Например, Почему size_t без знака? ), только частично * может быть исключено, потому что в 16-битной эпохе один дополнительный бит считался неправильным семантика, которую типы unsigned имеют в C ++ для такого рода использования.

К сожалению, теперь ошибка size_t не может быть исправлена ​​(из-за обратной совместимости), но зачем повторять ту же ошибку в другой не связанной области?

Обратите внимание, что, вероятно, большая ошибка была сделана просто из-за выбора имя unsigned (учитывая его реальное значение). Если бы этот тип был назван (более подходящим образом) modulo, то, вероятно, было бы более очевидно, почему использование modulo int для размера строки не имеет никакого смысла вообще.

Имя не имеет значения, то, что оно считает, является семантическим, и unsigned просто имеет неправильную семантику для счетчика или размера.

(*) Лично я не думаю, что это было достаточно веской причиной даже тогда. Если 32767 не достаточно для размера сейчас, то 65535 не будет достаточно скоро. По моему мнению, только один бит (удвоенное значение) не был приемлемой ценой для такого изгиба семантики.

РЕДАКТИРОВАТЬ

Я опубликовал видео , в котором более подробно обсуждаю, почему я считаю, что использование типа unsigned для size_t было ошибкой проектирования в C ++.

Слайды можно загрузить с http://raksy.dyndns.org/unsigned.pdf

18
задан Kekoa 18 June 2009 в 22:42
поделиться

1 ответ

Вы не сказали, на какой платформе вы находитесь, но вот одна в Microsoft .Net:

http://jclement.ca/devel/dotnet/reallysimplelicensing.html

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

В этой схеме используются Библиотека RSA и подпись XML. В принципе вы помещаете все, что хотите, в XML Документируйте и подпишите этот документ. затем вы можете предоставить этот файл своему клиент и приложение могут читать информация о лицензии из этого файл. Поскольку файл в цифровом виде подписанный файл лицензии НЕ может быть вмешиваться, если вы не отпустите закрытый ключ (который вы действительно не следует делать).

11
ответ дан 30 November 2019 в 09:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: