Мне интересно узнать, есть ли какие-либо стандарты или ресурсы, которые вы можете рекомендовать для разработки моделей лицензий на С#?
Разработка лицензий на С# - с чего начать?
Ответ 1
В С# вы можете использовать класс лицензирования, поставляемый Microsoft. Образец доступен по ссылке.
В принципе вы создаете класс, наследующий от LicenseProvider, и введите
[LicenseProvider(typeof(MyControlLicenseProvider))]
как атрибут вашего класса, который вы хотели бы получить. В вашей реализации (MyControlLicenseProvider
) вы можете запрограммировать соответствующие методы для проверки лицензии на ваши нужды, а затем выполнить кодовый вызов
License license = LicenseManager.Validate(typeof(MyControl), this);
Если лицензия не является нулевой, ваше приложение/элемент управления лицензируется.
Как утверждает сэр Грайстар, ни одна система не является безупречной, и кто-то с необходимыми навыками мог бы сконструировать себя вокруг вашей проверки. Не тратьте слишком много часов на выполнение каменной жесткой системы, но не делайте это легко обойти.: -)
Используя хеш, например SHA или одну из MD-хэш-функций, и загрузите их, некоторые ключевые данные могут быть использованы для создания простой проверки правильности. Ваш метод проверки может сделать что-то вроде
public override License GetLicense(LicenseContext context,
Type type,
object instance,
bool allowExceptions)
if (context.UsageMode == LicenseUsageMode.Designtime) {
// Creating a special DesigntimeLicense will able you to design your
// control without breaking Visual Studio in the process
return new DesigntimeLicense();
}
byte[] existingSerialKey = getExistingSerial();
// Algorithm can be SHA1CryptoServiceProvider for instance
byte[] data = HashAlgorithm.Create().ComputeHash(
username,
dateRequested,
validUntilDate,
// any other data you would like to validate
);
// todo: also check if licensing period is over here. ;-)
for (int l = 0; l < existingSerialKey.Length; ++l) {
if (existingSerialKey[i] != data[i]) {
if (allowExceptions){
throw new LicenseException(type, instance, "License is invalid");
}
return null;
}
}
// RuntimeLicense can be anything inheriting from License
return new RuntimeLicense();
}
Этот метод возвращает пользовательский License, который, например, имеет свойства относительно лицензирования, такие как DateTime на время завершения лицензирования. Настройка этого процесса не должна длиться долго, она хорошо работает как с WinForms, так и на сайтах ASP.NET, и будет препятствовать (без каких-либо гарантий) простой попытке разорвать ваше лицензирование.
Ответ 2
Я никогда не встречал ничего подобного стандарту в этом. То, что я лично сделал бы, это создать запись или что-то подобное, которая содержит всю информацию о лицензии и какие функции доступны до ввода ключа продукта, и как долго до истечения пробного срока или чего-то еще истекает (это может быть сложно, поскольку вы 't хотите сравнить с системной датой, поскольку это может быть изменено пользователем). Затем вы хотите зашифровать эту запись (возможно, засовывая и хешируя ее), чтобы функции можно было разблокировать только при вводе определенного ключа продукта. Вы также можете случайно генерировать указанный ключ, хотя я бы сделал это в определенном формате, чтобы пользователь всегда мог узнать ключ продукта, когда ему дано, и не путайте его с номером счета или любым другим.
Помните, что ни одна система не является безупречной, а кто-то из какой-то ОС каким-то образом найдет способ. Вероятно, это причина, по которой я никогда не сталкивался ни с какими стандартами, потому что ни один метод не полностью защищен. Вам просто нужно сделать все возможное.