C# 为产品激活生成序列号
首先,这不是为其他产品生成序列号的问题。我不是想“黑”其他产品 以下是我的要求:C# 为产品激活生成序列号,c#,asp.net-mvc-3,C#,Asp.net Mvc 3,首先,这不是为其他产品生成序列号的问题。我不是想“黑”其他产品 以下是我的要求: 我想生成一个标准的序列号:AILU7-ABCDE-54321-1234-AFCK-17UDF 我需要一些过程来验证序列号是否“有效”-这一部分确实非常复杂。也就是说,如果所有的数字加起来都大于X,我可以接受,但是如果有解决方案可以解决我的复杂性,我很乐意使用它们 验证序列号的过程可以而不是在服务器端。也就是说,我无法向外部web服务器请求验证序列号是否有效 我需要某种方法从序列号中提取元数据。也就是说,在我验证序
- 我想生成一个标准的序列号:AILU7-ABCDE-54321-1234-AFCK-17UDF
- 我需要一些过程来验证序列号是否“有效”-这一部分确实非常复杂。也就是说,如果所有的数字加起来都大于X,我可以接受,但是如果有解决方案可以解决我的复杂性,我很乐意使用它们
- 验证序列号的过程可以而不是在服务器端。也就是说,我无法向外部web服务器请求验证序列号是否有效
- 我需要某种方法从序列号中提取元数据。也就是说,在我验证序列号是否正确后,我需要能够从中读取一些值:“用户限制”、“过期日期”等
- 序列号的验证将通过ASP.NET MVC 3应用程序完成。但是序列号的生成不一定要这样做
在德尔福,但是理论掌握了任何语言。 有很多图书馆,一个也会有一个NuGuT程序包。
使用串行键,你需要考虑一些事情。
我在搜索过程中看到了指向使用简单Guid.NewGuid()的链接;方法,然后对字符串进行一些转换,以生成自定义样式的串行键。这很容易做到,但让产品所有者有责任跟踪数据库中的串行密钥,最终可能会有人通过使用Guid.NewGuid()随机查找工作序列;他们自己。如果地球上的每个人都同时开始生成guid,那么碰撞的可能性就非常大 通过在Guid.NewGuid()上使用更复杂的算法,有一种解决方案可以降低发生冲突事件的可能性 为此,我倾向于使用: 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来增加难度。
这意味着查找序列组合将花费更长的时间,但也使其更安全
显然,您会将这些数据组合存储在某个地方,以便在激活期间,您可以比较串行代码和产品密钥(Nonce)
在我的示例中:我使用串行密钥(16位)、递增int和单词Alpha作为秘密salt
这使得生成串行密钥的速度变慢且占用大量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;
}
秘密Salt可以是映射到您可能正在开发的不同产品的代码短语。这允许您重用产品密钥(Nonce)跨多个产品线的值。你看到了这个链接吗?所以:我不确定你想要实现什么是可能的,例如,在短字符串中嵌入公司名称将是非常困难的,如果可能的话。如果你需要额外的元数据,也许你应该考虑一个许可证文件模型来代替或存储一个密钥->某个地方的元数据映射。@Ian-我也完全同意。我只需要关于如何开始使用该模型的信息。目前我对密码学一无所知。@Ian-同意。当然可以通过短字符串验证公司名称或任何其他内容,但对其进行编码要困难得多。这是一种压缩苏。@BryanRay:我实际上不知道任何例子(我想看看是否有一种常见的方法)。想法是你有一个包含所有元信息(公司名称、机器信息等)的文件和生成的ID。然后提供商将使用私钥对其进行散列。应用程序将使用公钥通过检查散列来验证文件是否未被修改,然后可以从中读取所有许可证信息。非常棒的链接。我将从那里开始。t