人类可读的GUID

时间:2009-12-18 04:01:26

标签: language-agnostic

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

优惠券需要用户输入的代码。代码需要具备以下品质:

  1. 在长度和内容方面有一定程度的人类可读性,以防止用户受挫和数据输入错误。
  2. 给出一个优惠券代码,而不是猜测另一个优惠券代码。
  3. 如果我使用GUID,我关注第1点。如果我使用递增整数,我关注第2点。中间必须有一些快乐的媒介,对吧?我想也许这项工作已经完成,并且有一个理想的解决方案等着我。如果没有这个,我想我会使用随机的字母数字字符串,或者只是字母(为了清楚起见,不包括I和O),并且应用程序块IP地址失败了X次,这表明可能的蛮力攻击。如果我继续使用它,字符串的长度和X的值将起作用,为什么?

    感谢您的帮助!


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

13 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:4)

只有8个字母数字字母(I和O除外)有1785793904896种可能的组合。只要您没有5亿美元的优惠券,那就是所有意图和目的都是不可能的。

答案 3 :(得分:4)

AOL过去常常将两个单词的随机组合用于他们发出的CD。您可以采用相同的方法,只需增加单词数即可获得所需的几率。

答案 4 :(得分:3)

好吧,如果确实希望人类可读,您可以使用BubbleBabble。创建一个如下所示的Perl脚本:

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

然后将任何要获得输出的命令行参数提供给它,如下所示:

xogan-nydut-zogiv-kotyn-ledah-taseb-gyhib-tucel-vudul-mykom-mexax

或者如果Perl不是您的偏好,您可以使用APG的可发音密码模式(also available online)来获得如下输出:

BedHiv
cotsEub
AvRabinn
rarcUs
TeuvVarn
yuwats

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

答案 5 :(得分:2)

5个字符,每个5个字符应该足够 - 四个块用于“密钥”,第五个块作为校验和以确保有效性。当然,不要使用整个键空间。

无论如何,这大致是软件序列号的布局。

答案 6 :(得分:2)

嗯,我不知道大多数系统是如何工作的,但我认为定义一个静态数字并将该数字乘以一个随机的其他数字会很简单。然后,如果大GUID是静态的倍数,那么你很好。

易于生产,不易猜测新的(仅限短期使用)

int i = 61234;
int j = rand()%99999
long GUID = i * j;

会给你一个电话号码长度GUID

但是只有99999使用! DOH

答案 7 :(得分:2)

可能最好避免所有的元音[*],从而避免所有的脏话。

[*]如果你是威尔士人,请包括W!

答案 8 :(得分:2)

上下文

  • 可读的UUID
  • 语言无关的算法

问题

  • 设计一种用于生成“人类可读” UUID(HR-UUID)的算法
  • HR-UUID应该能够抵抗暴力猜测
  • 人类的进入和回忆应该简单明了且不容易出错
  • 具有1个或多个已知有效HR-UUID在统计上与猜测其他有效HR-UUID无关

解决方案

  • 使用DiceWare password algorithm
  • 与该线程中提供的其他解决方案相反,此方法通过将问题重铸为密码生成问题来解决人类可读的UUID问题。
  • 与本线程其他地方提供的BubbleBabble解决方案相反,Diceware允许您根据希望“滚动掷骰子”的次数来选择每个UUID中包含多少个元素。意味着您可以根据每个UUID选择熵
  • DiceWare密码算法解决了生成高熵密码短语的问题,尽管如此,人类仍然可以轻松输入和记住这些密码短语
  • 以下是Diceware“ UUID”的样本,每个样本均包含六个元素
    crabmeat-coach-properly-driving-yoga-ferret
    edition-mousy-fabric-budding-book-mortuary
    rickety-uncrown-earful-majority-sublet-evade

另请参见

答案 9 :(得分:1)

一个简单的解决方案是调用大多数语言对其字符串类型具有的getHashCode方法。将字符串设置为已批准单词列表中的某个单词。然后调用gethashcode,这将是你的关键。要对其进行验证,请将其与现有单词哈希列表进行比较,并将其从列表中删除,以便不能再次使用。

答案 10 :(得分:1)

我假设您在购买优惠券时收到了电子邮件地址(您应该)。如果是这样,为什么不给他们发送一次性使用GUID?这样你和他们都有记录,你可以跟踪兑换,你不会冒猜测的风险(或者至少没有一个值得打扰),用户不必记住任何东西,因为它在那里电子邮件,你不需要编码任何东西。

他们会给你电子邮件地址。您通过电子邮件发送GUID(带链接)。他们点击链接并获得歌曲。 GUID使用已在系统中注册,将不再有效。

答案 11 :(得分:1)

为什么不直接使用GUID然后用不同的字母替换任何可疑字符(所以0变为'h',1变为'q'等等。)

答案 12 :(得分:0)

您可以尝试random letter sequence generator ?之类的内容。你也可以混合和匹配字母/数字