用C#开发许可证 - 我从哪里开始?

时间:2010-05-24 12:18:15

标签: c# .net security licensing license-key

我很想知道是否有任何标准或资源可以推荐用于在C#中开发许可证模型?

2 个答案:

答案 0 :(得分:21)

在C#中,您可以使用Microsoft提供的Licensing class。可以通过链接获得样本。

基本上,您创建一个继承自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站点,并且会阻止(不保证暗示)一个简单的尝试来打破你的许可。

答案 1 :(得分:1)

我从来没有遇到像这样的标准。我个人所做的就是创建一个记录或类似的东西,其中包含许可证的所有信息,以及在输入产品密钥之前可用的功能,以及试用之前多长时间或任何到期时间(这可能会很棘手)我想与系统日期进行比较,因为这可以由用户更改。然后,您希望加密此记录(可能通过对其进行盐析和散列),以便只有在输入特定产品密钥时才能解锁这些功能。您也可能想要随机生成所述密钥,尽管我会以特定格式执行此操作,以便用户在获得产品密钥时始终可以识别产品密钥,并且不要将其与发票编号或其他任何内容混淆。

记住,没有一个系统是万无一失的,某个操作系统上的某个人会以某种方式找到方法。这可能是我从未遇到任何标准的原因,因为没有方法是完全安全的。你只需要尽力而为。