【问题标题】:Creating a large number of random serial keys创建大量随机序列密钥
【发布时间】:2012-12-13 16:15:08
【问题描述】:

我正在开发一个应用程序,其中用户只有在正确输入序列密钥时才能通过身份验证。此序列密钥与数据库中已存在的序列密钥匹配。此序列号应由 6 个数字和 3 个字母组成。用户以书面形式从我这里获得这些密钥。

如何生成大量(大约 100,000,000 个)序列密钥?

【问题讨论】:

  • 用户如何获得密钥?
  • 他们以书面形式获得
  • 您对密钥的“安全性”要求有多高?假设没有校验和,攻击者平均必须生成约 176 个密钥才能正确猜出一个。够好吗?
  • 我需要它具有高安全性和校验和。
  • 添加校验和会降低安全性(尝试更少的密钥)

标签: algorithm random license-key serial-number


【解决方案1】:

我认为最简单的方法是:

  1. [1,10000000)范围内找到一个想要的数字,让它成为x 将代表您的 6 位数字。
  2. 找到 3 个字符(假设在 a-z 范围内)。让他们成为a,b,c
  3. 您的号码是(a-'a' + b-'a'*26 + c-'a'*26*26)*10000000 + x

(其中'a'是字符'a'的ascii表示,a-'a'表示数字ascii减法)

请注意,生成的数字甚至可以放入 long - 假设它是 64 位。


可以通过迭代简单地生成多个数字,从a=b=c='a'x=0开始,然后开始前进(增加1)。一旦达到x=10000000,增加a,如果a 超过z - 增加b,....(类似于您在普通整数加法运算中所做的)。

【讨论】:

  • 是随机的吗?它看起来像是一种很容易预测的顺序。
  • @GaganDeep:不,它是顺序的(我不明白你是随机的)。要获得随机性,可以迭代地为 x、a、b、c 创建不同的值,并维护一组以检查这些值是否仍然可用。
【解决方案2】:

您可以使用像SecureRandom 这样的安全随机数生成器来生成密钥。

但正如评论中已经提到的,如果您生成那么多键,那么所有可能键的空间不会大很多。因此,攻击者很容易尝试使用密钥,直到找到有效的密钥。

【讨论】:

  • 那么解决方案是什么?
  • 使用 SecureRandom 您可以生成足够的随机字节,您可以将其转换为看起来像您描述的密钥。例如,就像阿米特在他的回答中描述的那样。如果您需要更高的安全性,请延长密钥。
猜你喜欢
  • 1970-01-01
  • 2018-02-05
  • 1970-01-01
  • 1970-01-01
  • 2013-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-16
相关资源
最近更新 更多