首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成用于产品激活的序列号

生成用于产品激活的序列号
EN

Stack Overflow用户
提问于 2012-12-12 16:14:15
回答 3查看 9.6K关注 0票数 7

首先,这不是一个为其他产品生成序列号的问题。我是,而不是,希望“黑”其他产品。

以下是我的要求:

  • 我想生成一个标准的查找序列号:AILU7 7-ABCDE-54321-1234-afkk-17udf。
  • 我需要一些进程来验证这个序列号是否“有效”--这部分而不是必须非常复杂。如果所有的数字之和都大于X-我会同意的,但如果有解决方案,为我处理这个复杂性,我会很高兴使用它们。
  • 验证序列号的进程可以而不是服务器端。我无法向外部web服务器发出请求来验证序列号是否有效。
  • 我需要一些方法从序列号中提取元数据。在我确认序列号是正确的之后,我需要能够读出其中的一些值:“用户限制”、“过期日期”等等。
  • 序列号的验证将通过ASP.NET MVC 3应用程序进行。但是,序列号的生成是而不是必须这样做的。

我并不是在寻找能满足所有这些需求的灵丹妙药,而是或多或少地寻找一些指向文档或现有库的链接,这些链接将帮助我开始工作。我看到的唯一一个库是XHEO DeployLX库,它完全满足了我的需要。

你能给我提供任何信息,指出我的正确方向吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-12 16:17:11

你查过布兰登·斯塔格关于这个问题的文章了吗?

在德尔菲里,但是理论掌握着任何语言。

票数 5
EN

Stack Overflow用户

发布于 2012-12-12 16:22:17

有很多库,其中一个是http://skgl.codeplex.com/ & http://softwareprotector.codeplex.com/,它还附带了nuget包。

票数 4
EN

Stack Overflow用户

发布于 2016-01-27 11:04:32

使用串行密钥,您需要考虑一些事情。

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

有一种解决方案可以通过在Guid.NewGuid()之上使用更复杂的算法来降低碰撞事件的可能性;

为此,我倾向于使用:

  1. Guid.NewGuid();(前16个字符,减去-(连字符))
  2. 不断增加或不断变化的值。(现在)( int将起作用: i++等)
  3. 一种你将在你的网络中保持私密和安全的秘密盐。
  4. 困难因素:从比特币中借用这一原则。

好吧,让我们想象一下,我从guid中取了前16位数字。然后,我将它与现在的和秘密盐组合在一起,然后使用SHA256从值中派生出一个散列。然后,我可以使用困难因子来确定散列是以0的数量开始,还是以我想要的其他字符开始。

如果散列有6个前缀,那么我保存所有的数据,因为我刚刚找到了一个相当安全的串行密钥。

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

一些示例代码很粗糙,因为我很无聊。

您的应用程序可以将产品密钥和序列发送到激活服务器。服务器知道秘密盐。然后返回true或false,以确定生成的散列是否满足安全要求。如果没有:序列无效,或者对提供的密钥无效。如果它有所需的0:它是一个有效的串行。

代码语言:javascript
复制
    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";

此方法的示例输出如下所示:

代码语言:javascript
复制
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,可以增加难度。这意味着,找到串行组合将花费更长的时间,但也使它更安全。

显然,您会将这些数据组合存储在某个地方,因此在激活过程中,您可以比较Serial和Product (现在)。

在我的示例中:我使用串行密钥(16位数字),递增int,并使用字Alpha表示秘密盐。

这使得生成串行键速度慢,cpu密集,但验证速度非常快。

代码语言:javascript
复制
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)值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13843937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档