【发布时间】:2010-09-07 06:36:59
【问题描述】:
几个月前,我的任务是为我们的 Web 应用程序实现一个独特的随机代码。代码必须对用户友好且尽可能小,但本质上仍然是随机的(因此用户无法轻易预测序列中的下一个代码)。
它最终生成了如下所示的值:
Af3nT5Xf2
不幸的是,我从未对实施感到满意。 Guid 是不可能的,它们太大了,用户难以输入。我希望有更多的 4 或 5 个字符/数字,但如果我们编码为,我们的特定实现会生成明显的图案序列少于 9 个字符。
这是我们最终做的:
我们从数据库中提取了一个唯一的连续 32 位 ID。然后我们将它插入到一个 64 位 RANDOM 整数的中心位中。我们创建了一个易于键入和识别的字符(A-Z、a-z、2-9 跳过容易混淆的字符,如 L、l、1、O、0 等)的查找表。最后,我们使用该查找表对 64 位整数进行 base-54 编码。高位是随机的,低位是随机的,但中心位是连续的。
最终的结果是一个比 guid 小得多的代码,而且看起来是随机的,尽管它绝对不是。
我从未对这种特殊的实现感到满意。你们会怎么做?
【问题讨论】:
-
为什么需要顺序值?你有回过头来吗?如果是,请使用加密函数使用密钥加密您的序列号,并使用您选择的字母对密码进行编码。
-
很久没有问这个问题了。我很久以前就拒绝了这种方法。多年来,我现在使用加密强随机数生成器生成所需位的随机数,将数字存储在具有唯一密钥约束的数据库中,并在一段时间后(通常为 24 小时)使数字失效。我从未见过碰撞,如果有,我会重试。简单有效的解决方案。
标签: encoding cryptography key