我有具有唯一序列号(字符串增量) ex : AS1002和AS1003的设备。
我需要找出一个算法来为每个序列号生成唯一的激活密钥。
最好的方法是什么?
谢谢!
(必须脱机完成)
发布于 2011-09-22 16:12:20
你在这里有两件事要考虑:
首先,没有办法绝对肯定地说,不管你多么想搞糊涂,也没有人能破译你的密钥生成程序。只需做一个搜索引擎查询“破解Xyz软件”。
这是一场永无止境的长期斗争,因此采取了以服务的形式交付软件的做法,也就是说,在网上,生产者对他们的内容有更多的控制权,并且可以明确地授权和认证用户。在您的情况下,您希望脱机执行此操作。因此,在您的场景中,会有人将您的设备附加到某个系统,而您打算编写此例程的相应软件将根据设备v/s用户输入的序列号进行检查。
基于@sll的回答,考虑到您请求的脱机性质。不幸的是,您最好的方法是生成一组随机代码,并在用户调用时验证它们。
这是一个从另一个方法借来的答案,我也添加了数字
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位字符串时,这个例程会产生这样的字符串,这是相当随机的。
3477
ROT6GRA39O
40 40HTLJPFCL
5M2F44M5CH
CAVAO780NR
8XBQ44WNUA
IA02WEWOCM
EG11L4OGFO
LP2UOGKKLA
H0JB0BA4NJ
KT8AN18KFA
发布于 2011-09-22 15:37:36
如果您的设备有一些无法通过连接编程器或其他设备读取的安全内存,-you可以存储一些密钥代码,然后使用任何哈希算法(如MD5或SHA-1/2 )生成哈希:
HASH(PUBLIC_SERIALNUMBER + PRIVATE_KEYCODE)并将SERIALNUMBER +密钥码存储在本地DB中。
以这种方式:(脱机)
如果设备上有安全内存(就像SmartCards那样),可以通过存储激活代码本身来简化这一点。通过这种方式,您可以只保留自己的SerialCode - ActivationCode对数据库。
发布于 2011-09-22 15:40:04
到目前为止,最安全的方法是拥有一个由(序列号、激活密钥)对组成的集中式数据库,并让用户在互联网上激活,这样您就可以在本地(在服务器上)检查密钥。
在这个实现中,激活密钥可以是完全随机的,因为它不需要依赖于序列号。
https://stackoverflow.com/questions/7517399
复制相似问题