我正在集体讨论序列号方案。我做错了吗?
序列号格式:
- 24个八位字节,用24个十六进制表示 字符加上连字符 可读性
例如D429-A7C5-9C15-8516-D15D-3A1C
- 0-15:{电子邮件+主哈希}
- 16-19:{id}
- 20-23:{时间戳}
email+master hash 算法:
- 生成 md5 哈希用户的电子邮件(32 字节)
- 生成未公开的主密钥的 md5 哈希值
- ,异或这两个哈希值
- 删除奇数字节,将大小减少到 16,
- 例如 D429A7C59C158516D15D3A1CB00488ED --> D2AC9181D531B08E
id:
- 最初为 0x00000000,然后随着每个许可证的出售而递增
时间戳:
- 购买许可证时生成的时间戳
验证:
- 为了注册产品,用户必须输入 1) 电子邮件地址和 2) 序列号,
- 生成电子邮件+主哈希并验证其是否匹配序列号的0-15
- 从序列中提取时间戳并验证它是否<当前时间戳和 >= 第一个许可证出售的日期
serial number format:
- 24 octets represented by 24 hex
characters plus hyphens for
readibility e.g. D429-A7C5-9C15-8516-D15D-3A1C
- 0-15: {email+master hash}
- 16-19: {id}
- 20-23: {timestamp}
email+master hash algorithm:
- generate md5 hash of user's email (32 bytes)
- generate md5 hash of undisclosed master key
- xor these two hashes
- remove odd bytes, reducing size to 16
- e.g. D429A7C59C158516D15D3A1CB00488ED --> D2AC9181D531B08E
id:
- initially 0x00000000, then incremented with each licence sold
timestamp:
- timestamp generated when license is purchased
validation:
- in order to register product, user must enter 1) email address and 2) serial number
- generate email+master hash and verify that it matches 0-15 of serial
- extract timestamp from serial and verify that it is < current timestamp and >= date first license is sold
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我不是这方面的专家,但这种方法可能存在一些问题:
I'm no expert on this, but there are a few things that might be problematic with this approach:
在 templatetypedef 的回复中添加一些要点:
如果您必须将电子邮件和主密钥的哈希值结合起来,请对两者的串联进行哈希处理。更好的是,对电子邮件+密钥+id 进行哈希处理,以防有人购买两个或更多许可证并看到该模式,从而获得“更好”的安全性。
使用仅提供 16 个字节的哈希函数。如果必须使用 MD5,则任何截断都同样糟糕,因此只需取前 16 个字节即可。
您的 ID 从未在验证中使用。
您将不会受到密钥共享的保护(例如warez 网站)。
序列号可以保护您免受极少数的攻击。这可能不值得您花费时间和精力。
Some points to add to templatetypedef´s reply:
If you must combine hashes for the email and your master key, hash the concatenation of both. Even better, hash email+key+id for even "better" security in case someone purchases two or more licenses and sees the pattern.
Use a hash function that gives you only 16 bytes. If you must use MD5, any truncation is equally bad, so just take the first 16 bytes.
Your id is never used in the validation.
You will not be protected from key sharing (e.g. warez sites).
A serial number protects you from very few attacks. It´s probably not worth your time and effort.