Licensing 正在查找许可证密钥算法

Licensing 正在查找许可证密钥算法,licensing,authorization,Licensing,Authorization,在堆栈溢出时,有许多与许可证密钥相关的问题。但他们没有回答这个问题 有谁能提供一个简单的许可证密钥算法,该算法与技术无关,不需要数学文凭就能理解 许可证密钥算法类似于公钥加密。我只需要一些简单的东西,可以在任何平台.NET/Java中实现,并使用简单的数据,如字符 以伪代码编写的答案是完美的。 因此,如果一个人出示一个字符串,可以生成一个补充字符串,即授权代码。下面是它将用于的常见场景 客户下载在初始启动/安装时生成唯一密钥的软件 软件在试用期内运行 在试用期结束时,需要授权密钥 客户在付款后前

在堆栈溢出时,有许多与许可证密钥相关的问题。但他们没有回答这个问题

有谁能提供一个简单的许可证密钥算法,该算法与技术无关,不需要数学文凭就能理解

许可证密钥算法类似于公钥加密。我只需要一些简单的东西,可以在任何平台.NET/Java中实现,并使用简单的数据,如字符

以伪代码编写的答案是完美的。

因此,如果一个人出示一个字符串,可以生成一个补充字符串,即授权代码。下面是它将用于的常见场景

  • 客户下载在初始启动/安装时生成唯一密钥的软件
  • 软件在试用期内运行
  • 在试用期结束时,需要授权密钥
  • 客户在付款后前往指定的网站,输入其代码并获取启用软件的授权代码:)

  • 不要害怕描述你的答案,就像你在和一个5岁的孩子说话一样,因为我不是数学家。

    在安全问题上,不重复使用一个众所周知的、经过测试的算法并尝试创建自己的(缺乏数学知识)是自杀性的


    披露:我完全缺乏创建这种算法的数学程度,坦率地说,我个人不知道有谁拥有这种算法

    没有可靠的授权算法。真正地一个也没有。对于你能买到的最流行、最昂贵的专有软件,你还可以找到“密钥生成器”和不需要授权的黑客版本

    与其担心它“牢不可破”,不如做一些简单的事情。一种流行的机制是,在购买时询问用户名,然后给他一个许可证密钥,该密钥来自用户名的加密散列(例如MD5总和)或其变体。然后,在软件中再次询问他们的名字,加上注册密钥(MD5派生的东西);检查它们是否匹配,这将激活软件


    这个能被黑客攻击吗?绝对地一旦有人知道您是如何生成许可证密钥的,他们就可以生成自己的许可证密钥。但是,如果你保存了一个迄今为止生成的“官方”许可证密钥数据库,至少你以后能够识别欺诈者(可能是在他们试图下载“高级”内容或其他内容时)


    但是不要太担心阻止黑客破解你的代码。这是会发生的,但它们在市场中所占的份额很小,不会对您的整体销售产生重大影响。

    老实说,您所做的一切都是毫无意义的。不管编写一个验证/加密/密钥系统需要多少时间,估计有人破坏它大约需要一半的时间。即使您加密了最终的可执行文件。然而,作为一种延迟措施或减少人们因被盗拷贝而获得高级支持的机会的方法,它将有所帮助。也可用于简单跟踪买家。或者为了好玩p

    无论如何,有几种方法可以处理它。 许多软件使用名称(可能还有公司)字符串和哈希函数生成密钥。这样做的优点是保持常量(只要名称相同,哈希值相同,密钥也相同)。它也是一个非常简单的系统,特别是如果您使用众所周知的散列,如MD5

    hash = md5(name);
    
    一些更高级的应用程序使用一个内部函数来生成某种类型的验证代码,当您将其与给定的名称组合在一起时,您可以创建(并发回)一个散列

    一些人使用基于系统的代码(Windows就是一个很好的例子),它对硬件进行采样并从中构建标识符。如果您可以获得处理器名称、速度或其他任何信息,您可以运行类似的操作。唯一的问题是系统更改可能导致代码无效,因此您可以警告用户(并泄露部分过程)或让他们意外发现(不好)

    可以使用哈希函数、数据获取、字符串输入、布尔运算等任意组合。一件事需要考虑的是,您不需要能够逆转该过程。只要您可以用相同的结果复制它(任何好的散列函数都可以),您就可以相互检查散列结果并确保其有效。你投入的越多,事情就越复杂,但越难破解


    希望这对你的问题有所帮助。

    我使用这样的系统:

    const string secretMumboJumbo = "sdfkldafskjlfajmkldsfjaewumaskldfladkkldsfklj"
    
    //For you to generate keys
    string GenerateLicenceKey(int idNr)
    {
        return Sha1Hmac(key=secretMumboJumbo, messageToEncode=idNr)
    }
    
    //For clients to check if key is valid, 
    bool IsKeyValid(string key)
    {
       for(int i=0;i<maxNrOfLicenceKeys;i++)
          if(key == GenerateLicenceKey(i))
             return true;
       return false;
    }
    
    •根据windows许可证密钥+试用期结束日期创建字符串

    •从字符串生成哈希(Sha/md5)

    •将试验结束日期转换为整数(例如天数)

    •密钥变成试用结束日期+散列的某一部分

    •将密钥仅转换为大写字符,以便于输入

    ABCD-DEFG-HIJK

    验证的工作原理如下

    •再次将密钥转换为字节

    •摘录试验结束日期

    •根据windows许可证密钥+试用结束日期创建字符串

    •散列

    •将散列与密钥的其余部分进行比较


    这对我的观众来说已经够难了

    老实说,许可证密钥在我看来毫无用处。
    如何阻止您的客户将密钥分发给其他人?当然,您可以设置一个许可证密钥服务器来记录激活次数,但这需要花钱,如果它停止或消失,会发生什么

    在我的专业观点中,创建一个用户独有的软件(当然是在程序内部加密的)。例如,如果转到软件的帮助->关于,则显示此人的姓名、电话以及可能的地址。通过这种方式,如果他们将其上传到某种盗版网站,不仅其他人会知道这家伙的个人信息……而且你也会知道,以便向他收取更多许可证费用或起诉他。

    sysID = processor_name() | ram_Speed();
    hash = md5(sysID & name);
    
    const string secretMumboJumbo = "sdfkldafskjlfajmkldsfjaewumaskldfladkkldsfklj"
    
    //For you to generate keys
    string GenerateLicenceKey(int idNr)
    {
        return Sha1Hmac(key=secretMumboJumbo, messageToEncode=idNr)
    }
    
    //For clients to check if key is valid, 
    bool IsKeyValid(string key)
    {
       for(int i=0;i<maxNrOfLicenceKeys;i++)
          if(key == GenerateLicenceKey(i))
             return true;
       return false;
    }