Разработка лицензий на С# - с чего начать?

Мне интересно узнать, есть ли какие-либо стандарты или ресурсы, которые вы можете рекомендовать для разработки моделей лицензий на С#?

Ответы

Ответ 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 хотите сравнить с системной датой, поскольку это может быть изменено пользователем). Затем вы хотите зашифровать эту запись (возможно, засовывая и хешируя ее), чтобы функции можно было разблокировать только при вводе определенного ключа продукта. Вы также можете случайно генерировать указанный ключ, хотя я бы сделал это в определенном формате, чтобы пользователь всегда мог узнать ключ продукта, когда ему дано, и не путайте его с номером счета или любым другим.

Помните, что ни одна система не является безупречной, а кто-то из какой-то ОС каким-то образом найдет способ. Вероятно, это причина, по которой я никогда не сталкивался ни с какими стандартами, потому что ни один метод не полностью защищен. Вам просто нужно сделать все возможное.