我正在为序列号方案进行头脑风暴。我做错了吗?
-
14-10-2019 - |
题
序列号格式:
- 24个八位八组由24个十六进制字符加连字符,可读性
例如D429-A7C5-9C15-8516-D15D-3A1C
- 0-15:{电子邮件+主哈希}
- 16-19:{id}
- 20-23:{Timestamp}
电子邮件+主哈希算法:
- 生成用户电子邮件的MD5哈希(32个字节)
- 生成未公开的主密钥的MD5哈希
- xor这两个哈希
- 删除奇数,将尺寸降低到16
- EG D429A7C59C158516D15D3A1CB0048ED-> D2AC9181D531B08E
ID:
- 最初的0x00000000,然后加上每个售出的许可证
时间戳:
- 购买许可证时生成的时间戳
验证:
- 为了注册产品,用户必须输入1)电子邮件地址和2)序列号
- 生成电子邮件+主哈希并验证它与串行的0-15匹配
- 从串行中提取时间戳,并验证它是<当前的时间戳,> = = Date First许可证已出售
解决方案
我对此没有专家,但是这种方法可能会有一些问题:
- 使用MD5似乎不是一个好主意。 MD5拥有已知的安全弱点,并且有足够时间的人很容易提出某种碰撞。根据您使用序列号的方式,某人可以轻松地伪造看起来像其他序列号的序列号。使用SHA家族的东西可能会阻止这种情况。
- 您使用主密钥的用户电子邮件哈希的XOR并不是特别安全 - 我可以通过用自己的电子邮件将序列号轻松恢复主密钥的哈希。
- 将每个奇数的字节从安全的哈希中删除,都可以打破对哈希安全的保证。特别是,任何具有良好安全保证的哈希功能通常都要求产生的哈希中的所有字节都存在于输出中。例如,我可以通过获取第一个哈希的输出,在所有旧字节之间插入0s,然后输出结果,从而从任何现有的安全哈希函数中构建安全的哈希函数。这是安全的,因为如果您可以打破我的新哈希的任何安全属性,那将等同于打破原始哈希的安全属性。但是,如果您从新哈希(New Hash)中删除所有偶数字节,那么您就会获得所有零,这根本不是安全的。
- 四个字节足以容纳ID吗?这只给您2^32个不同的ID。
其他提示
一些要点要添加到TemplateTypEdef的答复中:
如果您必须将电子邮件和主密钥的哈希相结合,则将两者的串联放置。更好的是,如果有人购买两个或更多许可并看到模式,则哈希电子邮件+键+ID甚至是“更好”的安全性。
使用仅给您16个字节的哈希函数。如果您必须使用MD5,则任何截断都同样不好,因此只需拿前16个字节即可。
您的ID从未在验证中使用。
您将不会受到关键共享(例如Warez站点)的保护。
序列号可保护您免受极少数攻击。这可能不值得您的时间和精力。
不隶属于 StackOverflow