人类可读的GUID

Jam*_*Orr 11 language-agnostic

我正在写一个小型系统,允许我通过在我们的网站上生成可兑换MP3的优惠券来销售乐队的音乐.

优惠券需要用户输入的代码.代码需要具备以下特性:

  1. 在长度和内容方面有一定程度的人类可读性,以防止用户沮丧和数据输入错误.
  2. 给出一个优惠券代码,而不是猜测另一个优惠券代码.

如果我使用GUID,我关注第1点.如果我使用递增整数,我关注第2点.中间必须有一些快乐的媒介,对吧?我想也许这项工作已经完成,并且有一个理想的解决方案等着我.如果没有这个,我想我会使用随机的字母数字字符串,或者只是字母(为了清楚起见,不包括I和O),并且应用程序块IP地址失败了X次,这表明可能的蛮力攻击.如果我使用它,字符串有多长,X的值有多大,为什么?

谢谢你的帮助!


更新:我没有完全明确这个方法:我将生成用于打印的凭证代码列表,然后在演出后输入"已售出"代码.因此,我认为像校验和这样的元素不像在不使用验证服务器的软件密钥中那样.

caf*_*caf 9

您可以使用受过英语音节训练的马尔可夫链来创建一个由可发音的胡言乱语组成的句子.只需在打印时将生成的句子添加到有效凭证的数据库中(当然,当它们被兑换时使它们无效).

  • 让我想起了http://thedailywtf.com/Articles/The-Automated-Curse-Generator.aspx (9认同)

Mar*_*som 5

AOL 曾经在他们发出的 CD 上使用两个单词的随机组合。您可以采用相同的方法,只需增加单词数即可获得所需的赔率。


Ric*_*kNZ 5

我会使用你自己的编码方案.除了省略I和O之外,为了获得最佳的可读性,省略除了近同音词集(C/E,M/N)和多音节字母(如W)之外的所有字母也是一个好主意,当然坚持一个案例.

就长度而言,您可以使用60位,加上4位校验和.64位就足以将时间存储到毫秒级的粒度数千年,因此无论是实际目的还是不可思议的.比如说每个字母4位,那是16个字母长.即便只有一半的长度可能很多.

另一种思考方式是以汽车牌照的形式:3个字母和3个数字足以覆盖相当大的状态,并且往往非常易读.除非你为某人提供了一种高速破解代码的方法,否则它们在人类时间尺度上肯定是不可猜测的.


Jos*_*ley 5

好吧,如果你真的想要人类可读,你可以使用BubbleBabble。创建如下 Perl 脚本:

#!/usr/bin/perl
use Digest::BubbleBabble qw(bubblebabble);
use Digest::SHA1 qw(sha1);
print bubblebabble(Digest => sha1(join(' ', @ARGV))), "\n";
Run Code Online (Sandbox Code Playgroud)

然后向其提供您想要获得输出的任何命令行参数,如下所示:

xogan-nydut-zogiv-kotyn-ledah-taseb-gyhib-tucel-vudul-mykom-mexax
Run Code Online (Sandbox Code Playgroud)

或者,如果 Perl 不是您的偏好,您可以使用PWGen也可以在线获取如下输出:

aiCee5om Ohxai2is tae3Gael Gaeth7ei ooCh0ish

老实说,这种人类可读性水平有点过分了。RickNZ 的答案应该可以正常工作(并且与我们对某些软件密钥所做的非常接近)。但 BubbleBabble 确实很有趣。


Tho*_*ini 4

仅 8 个字母数字字母(I 和 O 除外)就有 1785793904896 种可能的组合。只要你没有 50 亿代金券,这从任何角度来说都是不可猜测的。