序列号格式:
- 24 个八位字节由 24 个十六进制表示 字符加连字符 可读性
例如D429-A7C5-9C15-8516-D15D-3A1C
- 0-15: {email+master hash}
- 16-19:{id}
- 20-23:{时间戳}
邮箱+主哈希算法:
- 生成用户电子邮件的 md5 哈希值(32 字节)
- 生成未公开主 key 的 md5 哈希值
- 异或这两个散列
- 删除奇数字节,将大小减少到 16
- 例如D429A7C59C158516D15D3A1CB00488ED --> D2AC9181D531B08E
编号:
- 最初为 0x00000000,然后随着每个许可证的售出而递增
时间戳:
- 购买许可证时生成的时间戳
验证:
- 为了注册产品,用户必须输入 1) 电子邮件地址和 2) 序列号
- 生成 email+master hash 并验证它是否匹配序列号的 0-15
- 从序列中提取时间戳并验证它是<当前时间戳并且>=第一个许可证售出日期
最佳答案
我不是这方面的专家,但这种方法可能存在一些问题:
- 使用 MD5 似乎不是一个好主意。 MD5 有已知的安全漏洞,有足够时间的人很容易想出某种哈希冲突。根据您使用序列号的方式,有人可以轻松伪造一个看起来与其他序列号匹配的序列号。使用 SHA 家族的东西可能会阻止这种情况。
- 您的用户电子邮件散列与主 key 的异或运算并不是特别安全 - 我可以通过将序列号与我自己的电子邮件的散列进行异或来轻松恢复主 key 的散列。
- 从安全哈希中删除每个奇数字节会破坏哈希安全的保证。特别是,任何具有良好安全保证的散列函数通常都要求结果散列中的所有字节都出现在输出中。例如,我可以从任何现有的安全哈希函数中简单地构造一个安全哈希函数,方法是获取第一个哈希的输出,在所有旧字节之间插入 0,然后输出结果。它是安全的,因为如果您可以破坏我的新散列的任何安全属性,那将等同于破坏原始散列的安全属性。但是,如果您从新哈希中删除所有偶数字节,则会得到全零,这一点都不安全。
- 四个字节够用吗?那只会给你 2^32 个不同的 ID。
关于software-distribution - 我正在为序列号方案集思广益。我做错了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4581298/