从序列号生成激活密钥

时间:2011-09-22 15:31:32

标签: c# .net asp.net vb.net algorithm

我的设备具有唯一的序列号(字符串增量)例如:AS1002和AS1003。

我需要找出一种算法来为每个序列号生成一个唯一的激活密钥。

最好的办法是什么?

谢谢!

(必须离线完成)

5 个答案:

答案 0 :(得分:2)

这里有两件事要考虑:
- 无论你生成什么密钥都必须能够轻松输入,这样就可以消除一些奇怪的哈希值,这些哈希值可能会产生输入繁琐的字符,虽然这可以克服,但是你应该考虑这个问题。
- 您所说的操作必须在线完成

首先,没有办法绝对肯定地说,无论你多少尝试混淆,有人都无法破译你的密钥生成程序。只需对“Crack for Xyz software”进行搜索引擎查询。

这是一场永无止境的漫长战斗,因此将软件作为服务提供,即在线,生产者可以更好地控制其内容,并且可以明确授权和认证用户。在您的情况下,您希望离线执行此操作。因此,在您的方案中,有人会将您的设备连接到某个系统,而您打算编写此例程的附带软件将检查设备v / s用户输入的序列号。

基于@sll的答案,考虑到您的请求的离线性质。不幸的是,最好的方法是生成一组随机代码,并在用户呼叫时验证它们。

这是从另一个SO答案借来的method,我也添加了数字

private readonly Random _rng = new Random();
private const string _chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789"; //Added 1-9

private string RandomString(int size)
{
    char[] buffer = new char[size];

    for (int i = 0; i < size; i++)
    {
        buffer[i] = _chars[_rng.Next(_chars.Length)];
    }
    return new string(buffer);
}

因此,为每个设备生成一个设备并将其存储在某个地方可能是您唯一的选择,因为离线考虑因素。

当设置为创建一个10位数的字符串时,此例程将生成这样的字符串,这个字符串相当随机。

3477KXFBDQ
ROT6GRA39O
40HTLJPFCL
5M2F44M5CH
CAVAO780NR
8XBQ44WNUA
IA02WEWOCM
EG11L4OGFO
LP2UOGKKLA
H0JB0BA4NJ
KT8AN18KFA

答案 1 :(得分:1)

到目前为止,最安全的方法是拥有一个(序列号,激活密钥)对的集中数据库,并让用户通过互联网激活,以便您可以在本地(在服务器上)检查密钥。

在此实现中,激活密钥可以是完全随机的,因为它不需要依赖于序列号。

答案 2 :(得分:1)

您希望它易于检查,并且难以“倒退”。你会看到很多关于使用散列函数的建议,这些函数很容易用一种方法,但很难倒退。 Previously,我的意思是“将奶牛变成汉堡很容易,但很难把汉堡变成奶牛”。在这种情况下,设备应该知道自己的序列号,并能够向串口“添加”(或附加)一些秘密(通常称为“盐”),然后对其进行散列或加密。

如果您使用可逆加密,则需要在序列号中添加某种“check digit”,以便在有人确定您的加密方案时,还有另一层可供他们弄清楚。

一个容易“倒退”的功能的例子就是我解决了with Excel while trying to avoid homework

并且您可能希望通过手写将激活码写下来(例如您从电子邮件中写下来然后走到设备所在位置并打卡),使编码不太可能弄乱,从而使您的客户更轻松)中的字母/数字)。在许多字体中,I1以及0O足够相似,以至于许多编码(例如您的汽车的VIN)不使用字母io(我记得那些缺少数字1键的旧打字机,因为你应该使用小写L)。在这种情况下,Y47可能看起来相同,具体取决于某些字迹。因此,要了解您的受众以及他们的限制。

答案 3 :(得分:0)

如果您的设备有一些无法通过连接编程器或其他设备读取的安全内存 - 您可以存储一些密钥代码,然后使用任何哈希算法,如MD5SHA-1/2通过以下方式生成哈希:

HASH(PUBLIC_SERIALNUMBER + PRIVATE_KEYCODE)

SERIALNUMBER + KEYCODE对应存储在本地数据库中。

以这种方式:( 离线

  • 客户来电并要求您提供激活码
  • 您要求提供特定设备的SERIALNUMBER
  • 然后,您在本地数据库中通过给定的SERIALNUMBER搜索KEYCODE并生成激活码(即使使用MD5,这将是神圣的,因为长时间的KEYCODE私密存储在您的数据库中)
  • 客户端在设备中输入激活码,设备能够生成哈希值 通过自己的SERIALNUMBER和KEYCODE,然后与用户输入的激活码进行比较

如果设备上有安全内存(如SmartCards),可以通过存储激活码来简化这一过程。通过这种方式,您可以保留自己的SerialCode数据库 - ActivationCode对。

答案 4 :(得分:0)

如何:创建未向用户显示的密码。然后将此密码与序列号连接起来并散列组合。

你所做的任何事都可以被一个专门的黑客打破。问题不是,“我能创造绝对牢不可破的安全吗?”但是“我是否可以创建足够好的安全措施来防范不熟练的黑客并使其不值得为熟练的黑客付出努力?”如果您有理由期望销售1000万份产品,那么您将成为一个很大的目标,可能会有很多黑客会试图打破它。如果你期望出售几百或几千份,那就不多了。