3

序列号格式:

  • 由 24 个十六进制字符加上连字符表示的 24 个八位字节以提高可读性
  • 例如 D429-A7C5-9C15-8516-D15D-3A1C

    • 0-15:{电子邮件+主哈希}
    • 16-19:{id}
    • 20-23:{时间戳}

电子邮件+主哈希算法:

  • 生成用户电子邮件的 md5 哈希(32 字节)
  • 生成未公开主密钥的 md5 哈希
  • 异或这两个哈希
  • 删除奇数字节,将大小减小到 16
  • 例如 D429A7C59C158516D15D3A1CB00488ED --> D2AC9181D531B08E

ID:

  • 最初为 0x00000000,然后随着每个售出的许可证递增

时间戳:

  • 购买许可证时生成的时间戳

验证:

  • 为了注册产品,用户必须输入 1) 电子邮件地址和 2) 序列号
  • 生成电子邮件+主哈希并验证它是否与序列号的 0-15 匹配
  • 从序列中提取时间戳并验证它是<当前时间戳和>=第一个许可证出售的日期
4

2 回答 2

3

我不是这方面的专家,但是这种方法可能存在一些问题:

  1. 使用 MD5 似乎不是一个好主意。MD5 有已知的安全弱点,有足够时间的人很容易想出某种哈希冲突。根据您使用序列号的方式,有人可以轻松伪造一个看起来与其他序列号匹配的序列号。使用 SHA 系列的某些东西可能会阻止这种情况。
  2. 您的用户电子邮件哈希与主密钥的 XOR 并不是特别安全 - 我可以通过将序列号与我自己的电子邮件的哈希进行 XOR 轻松恢复主密钥的哈希。
  3. 从安全散列中删除每个奇数字节会破坏散列安全的保证。特别是,任何具有良好安全保证的散列函数通常要求生成的散列中的所有字节都在输出中。例如,我可以通过获取第一个散列的输出,在所有旧字节之间散布 0,然后输出结果,从任何现有的安全散列函数中简单地构造一个安全散列函数。它是安全的,因为如果你可以破坏我的新哈希的任何安全属性,它就等同于破坏原始哈希的安全属性。但是,如果从新哈希中删除所有偶数字节,则会得到全零,这根本不安全。
  4. 四个字节足够 id 吗?这只会给你 2^32 个不同的 ID。
于 2011-01-03T01:02:04.093 回答
1

Some points to add to templatetypedef´s reply:

  1. 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.

  2. 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.

  3. Your id is never used in the validation.

  4. 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.

于 2011-01-03T02:30:58.713 回答