我正在努力想出一种“智能”和“安全”的方式来生成大约6300万个用于比赛的独特代码。代码长度约为10个字符。
有没有人做过类似的事情或意识到这个问题可能产生的任何“障碍”?我们如何最大限度地降低某人能够猜测代码的可能性?
这个项目将在PHP中完成,但这并不重要,更多的逻辑是这里的问题。
任何反馈都会非常感激。
更新 只是为了澄清它将是10个字符的不区分大小写的Alpha数字值。 A-Z0-9
答案 0 :(得分:31)
<强>语法强>:
您可能会让人们复制这些代码,这意味着这些代码应该易于复制。 Gamecat指出,10 ^ 10太小了。 kgiannakakis有一个更好的主意,但这会导致另一个问题:“1”看起来很像“我”。 “0”,“C”,“O”和“Q”也非常相似。这不是一个大问题。定义一个安全的alfabet:“0123456789ABDEFGHJKLMNPRSTUVXYZ”(不包括COIQ)从评论:根据你选择的字体,5 / S和U / V也可能在视觉上不明确;根据需要更换。这是一个32符号(5位)代码。 10个字符的代码是50位数。生成,排序,复制,比较等等应该是相当微不足道的。被猜测的机会大约是0.63E-7
由于代码太长而无法记住,因此用户在复制时需要一个静止点。因此,将字符串拆分为两个或三个部分,并确保输入字段与此细分匹配。
E.g。 AKG3L-45TEE =&gt;两组5人,即使你记不起5个字符,也很容易找到你停止阅读的地方。
如何生成:
这很简单。您不需要特别复杂的算法来生成候选者。您可以为每个代码生成10个随机数,从每个数字中取5位(通常中间位最好,例如(rand()/ 64)模32 )。使用此值[0-31]作为字母表的索引。使用此字符串作为主键创建数据库表,并插入直到该表具有6300万个条目。您可能希望在此表中添加“生成日期”和“已兑换日期”。
答案 1 :(得分:10)
如果我理解正确的话,你想要创建63个百万个10位数的代码,这些代码的“猜测因子”很低。
有10,000,000,000个有效组合。其中63,000,000是价格数字。 63 / 10,000 = 0.0063。所以每次猜测都有0.63%的成功率。听起来不高,但是用蛮力,数字很容易获得。
你确定64比10000的比例足够好吗?
答案 2 :(得分:5)
在0 - 2 50 -1的范围内生成一组真正随机,唯一的64位数字。你需要跟踪你所看到的并拒绝重复。从32个字母的字母表中使用此数字的低50位中的每个5位 - 基本上所有英文字母(大写或小写)中的字母减去L和O加上数字2-9(这减少了l之间的混淆) / 1和0 / O)。对于6300万个代码,这将为您提供0.000006%的概率(63,000,000 / 2 50 )随机选择有效代码序列。
我还使用自动生成的主键(int)和使用32位随机值进行位交错来完成此操作。在这种情况下,我使用完整的64位从字母表生成13个字符,并在固定位置添加两个随机字符,用于15个字符的代码。在兑换代码时,你反转算法以提取密钥和随机性,丢弃两个额外的随机字符,然后将随机性与存储的密钥进行比较以验证代码。
答案 3 :(得分:4)
在使用字母数字代码时要小心,因为您不希望意外地产生令人困惑或令人尴尬的事情。为避免混淆,我建议删除1和L,0和O,可能还有8和B.为避免尴尬,请考虑删除所有元音,以免意外拼写任何东西(在这里使用你的想象力)。
答案 4 :(得分:2)
请参阅此link以在PHP中生成字母数字字符串。它使用36个字符的字母表,应该足够安全。但是不保证唯一性。我猜你可以使用Set来实现这个。由于这只是一次性操作,因此测试重复项的时间延迟不应该是一个大问题。
答案 5 :(得分:0)
使用安全随机数生成器。
答案 6 :(得分:0)
如果它们是针对唯一参与者,则可以散列每个参与者的姓名(和/或)详细信息,然后切断前10个字符。
答案 7 :(得分:0)
也许这会对你有所帮助:Universal Unique Identifier
UUID的目的是启用 分布式系统是唯一的 无需识别信息 重要的中央协调。 因此,任何人都可以创建UUID并使用 它用来识别某些东西 合理的信心 标识符永远不会 无意中被任何人用于 别的什么。
答案 8 :(得分:0)
你说代码的长度是10个'字符',但你的字符集是什么?
如果它只是数字,那么(@Gamecat)随机猜测代码可能有点太容易了。
另一方面,如果字符集是字母+数字,那么你就有足够的安全性。
在任何情况下使用安全随机数生成器生成,并在放入数据库之前检查重复项。