2012-05-03 23 views
2

我正在寻找有关创建系统的指导,该系统将允许我锁定我的程序并将它们置于试用模式。 我想要指导的部分是创建/检查键的算法,你们有什么建议吗? 我正在使用c#。要锁定程序的序列号/进行试用?

+3

没有建议的答案...但建议,永远不要忘记没有保护是无懈可击的。你应该花更多的时间来创建一个好的应用程序,这使得客户想要购买,而不是试图保护太多。保持简单,接受真相,你会被打破。 –

+0

[.NET许可系统]的可能重复(http://stackoverflow.com/questions/5132943/licensing-system-for-net) – user7116

回答

0

那么最好的方法是实现你自己的socket编码协议,这是真正的硬编码,所以黑客无法解码它,你应该不断地改变它。同样为了检查许可证,你应该联系你的套接字服务器,并且套接字服务器可以简单地联系数据库并检查该密钥是否有效。

这是我会怎么做,它可以实现还挺容易

0

你忘记了,有像dotPeekJustDecompile.NET Reflector工具,可以很容易地拆卸您的应用程序为源代码。您的保护很容易被删除。在SO上有很多类似的线程处理混淆,序列号等。这里有两个关于代码混淆的链接。

https://stackoverflow.com/questions/1988451/net-obfuscation

Alternative for Obfuscation in the .NET world

老实说,你会花很多时间在保护,这可能最终为浪费时间。这是不幸的,但它是现实。

0

重新发布来源:Generating a serial number for product activation

基本上 - 一旦软件是别人的电脑上,他们有他们喜欢修改软件尽可能多的能力,你不能阻止他们,短的法律行动,证明反汇编和执行法律处罚。

如果您真的想保护功能,您可以保持安全功能在线,并通过Web服务调用它。这样他们被迫支付,使用您的Web服务。 但是,如果您想找到生成序列密钥的方法。下面是一篇文章,我描述了一种生成'困难'串行密钥的方式,这需要很长时间才能完成,但需要一些时间来验证。 使用这种算法,您可以预先在数据库中生成序列密钥,然后将它们提供给客户。 唯一的问题是,再次 - 有人可以反汇编你的应用程序,只是删除代码的许可部分。 我会这样做,以便用户必须拥有有效的序列号才能下载软件并下载任何和所有更新。这将提供激励以成为合法的合法客户。 因此,如何使用这些连续编号的示例如下: 您可以使用下面的代码生成100个连续组合。 保存它们,然后将它们出售给客户。 给他们的序列号,产品密钥(号码)。

然后,当涉及到激活,他们进入你的网站,然后网站发送给他们的软件。

您的网站使用序列号,他们输入的产品密钥,并将其与软件的密码短语结合使用。 (在下面的例子中为Alpha) 如果三个部分联合在一起生成适当强度/难度的SHA256散列,那么它将认为它是成功的注册。 此外,您可以检查用户数据库以查看该序列是否与相关客户相匹配。 如果您想获得真正的安全性,可以创建一个启动器应用程序,用于下载产品的二进制文件,并在成功验证串行密钥后通过Assembly.Load加载它们。无论如何 - 重新发布现在开始。

转播:

不同,需要考虑一些事情串钥匙。

我在我的狩猎期间看到了指向使用简单Guid.NewGuid()的链接;方法,然后对字符串进行一些转换以制作自定义样式的串行密钥。这很容易做到,但将产品负责人责任追踪数据库中的序列密钥,并且在某天结束时,有人可能随机查找通过使用Guid.NewGuid()工作的序列。他们自己。如果地球上的每个人都同时开始生成Guids,碰撞机会就很有可能。

有一种解决方案,通过在Guid.NewGuid()上使用更复杂的算法,使碰撞事件发生的可能性更小。

对于这一点,我倾向于使用:

  1. Guid.NewGuid(); (只有前16个字符,减去 - (连字符)
  2. 不断递增或变化的值(随机数)(一个int将起作用:i ++等)
  3. 秘密盐,你将在你的网络中保密和保密。
  4. 一个难度系数:从Bitcoin借这个原则

好吧,让我们来想象我是从一个GUID取前16个位数 我然后结合起来,与随机值和秘密盐, 然后。使用SHA256从值中派生一个散列 然后,我可以使用难度系数来确定是否t他的散列开始于我想要的0或其他角色的数量。例如:如果散列有六个0的前缀,那么我将所有的数据都保存起来,因为我刚刚发现了一个相当安全的串行密钥。

当我的意思是安全的,我的意思是我已经找到了一个串行,当与一个产品密钥(Nonce)结合,然后与秘密盐一起使用时,它会产生符合我的生产标准的哈希。

一些示例代码如下 - 做得很粗糙,因为我很无聊。

这个想法可能是您的应用程序可能会将产品密钥和序列号发送到激活服务器。服务器知道秘密盐。然后它返回true或false来确定生成的散列是否符合安全要求。 如果不是这样:串行无效,或对提供的密钥无效。 如果它具有所需的0:它是一个有效的序列。

Guid theGuid; 
    string Hash = ""; 
    int iAccess = 0; 
    string PrivateSalt = "Alpha"; 
    string SourceString = ""; 
    string guidString; 
    while (true) 
    { 
     theGuid = Guid.NewGuid(); 
     guidString = theGuid.ToString().Replace("-", "").Substring(0,16); 
     SourceString = guidString + "|" + iAccess.ToString() + "|" + PrivateSalt; 
     byte[] data = Encoding.Default.GetBytes(SourceString); 
     Hash = Crypto.GenerateSHA256(data); 
     if (Hash.StartsWith(GetDiff())) 
     { 
      break; 
     } 

     iAccess++; 
    } 
    Console.WriteLine(SourceString+" Gives hash "+Hash); 
    string s1, s2, s3, s4; 
    s1 = guidString.Substring(0, 4); 
    s2 = guidString.Substring(4, 4); 
    s3 = guidString.Substring(8, 4); 
    s4 = guidString.Substring(12, 4); 
    string serial = s1 + "-" + s2 + "-" + s3 + "-" + s4; 

    Console.WriteLine(serial + " :" + SourceString + " Gives hash " + Hash); 

GetDiff()基本上只是一个字符串:“000000”;从这个方法

输出示例如下:

d9c9-f6f0-45be-427a :d9c9f6f045be427a|15135|Alpha Gives hash 000000f718f69c8389d496e01d1e992946fe1b8cf72bc4200a7a2b800b40aa0a 
fe49-70b9-08d8-40df :fe4970b908d840df|9096414|Alpha Gives hash 000000e29cfccfb54d1e7edc816feb084f1a2cd11a20c3132a965f9048fc9bf4 
7f58-0636-c853-4f0a :7f580636c8534f0a|12297217|Alpha Gives hash 0000007bb44f39a964bbe985885451c3dc0e037fcd12951261404e48819bf89b 
6f65-82d3-d95b-4882 :6f6582d3d95b4882|15064854|Alpha Gives hash 000000f1a3bed79e441108cfd26d8733d3fc10f5cd66d234ed35fe2b769663a3 
edee-b8b7-9f6f-40ab :edeeb8b79f6f40ab|17782415|Alpha Gives hash 000000b70b96e7b008a96a860efc572fe868154ae81e67b9397249a51f2db71c 
0948-4bb3-7de4-4054 :09484bb37de44054|21105690|Alpha Gives hash 000000ec7317eccd5fd9bb701759a2b0e77d37099347d9d665f4b492a69ca3ec 
bbf5-5119-bf4e-463c :bbf55119bf4e463c|21715642|Alpha Gives hash 000000a134c886d01606da83cd5e8f672fddb6aa061968e9f08202c781514b16 
80f6-c9c5-0ddf-436d :80f6c9c50ddf436d|26450310|Alpha Gives hash 00000092305b2956381c23dacba5b8ff9a37ab994148b37677732dc2a0650386 
0a4f-143b-b5f5-48ca :0a4f143bb5f548ca|33691865|Alpha Gives hash 00000054ecdae57c6ec686b6084faf68ae49a78f7c07bbe8e51357d76de63870 

您可以通过添加更多的0到前缀增加难度。 这意味着查找串行组合需要更长的时间,但也使其更安全。

很明显,您会将这些数据组合存储在某处,因此在激活期间,您可以比较串行代码和产品密钥(随机数)。

在我的例子中:我使用串行密钥(16位数字),增量int和秘密盐字Alpha。

这使得生成串行密钥缓慢和CPU密集型,但使得验证他们非常快。

IsSerialValid("edee-b8b7-9f6f-40ab", 17782415); 

public bool IsSerialValid(string serialCode, int ProductCode) 
     { 
      string SourceString = serialCode.Replace("-", "") + "|" + ProductCode.ToString() + "|" + "Alpha"; 
      byte[] data = Encoding.Default.GetBytes(SourceString); 
      string Hash = Crypto.GenerateSHA256(data); 
      if (Hash.StartsWith(GetDiff())) 
      { 
       return true; 
      } 
      return false; 
     } 

秘密盐可能是一个代码短语,映射到您可能正在开发的不同产品。这使您可以跨多个产品线重新使用产品密钥(Nonce)值。