2010-09-29 78 views
2

我在格式一系列代码:我怎么可以散列/混淆9-11个字符唯一

AA12345A1 

即:[a-z]{2}[0-9]{5}[a-z][0-9]

AA12345A123 

即:[a-z]{2}[0-9]{5}[a-z][0-9]{3}

我需要创建一个新的任何格式的“代码”从上述任何一种格式以掩盖以1号码结尾的号码和以3号码号码结尾的号码之间的差异(这向用户揭示了我需要隐藏的信息)。

为新的代码格式的约束条件是:

  • 它们需要是人类使用(因此,使用大写和小写字母是一个坏主意可用性明智的,也应尽可能短)
  • 他们必须是唯一的(9号或11字符的代码应该产生相同的输出)
  • 只需要一个单向散列,我从来没有需要获得原代码后面
  • 原来的长度代码(9或11个字符)一定不是显而易见的 - 它不需要密码对于外行来说只是不透明的。

是否有任何合适的哈希算法来做到这一点,或有没有人有任何建议这样做的自定义方式?

感谢

回答

2

A之间得到一个值非常简单的方式进行模糊处理将是:

  • 偷偷和随机挑选一半字母表示9个字符,另一半表示11个字符。
  • 前面加上一个从正确的半随机字母的字符串(即,如果它是一个9个字符的字符串前面加上从9个字符半信)
  • 如果字符串为9个字符,追加2个随机数字

然后,在使用时,您知道如果第一个字符来自一半意思是9个字符,则可以丢弃最后两位数字。

尽管每个字符串都会有12个字符。

0

你有两个任务:

  • 创建哈希
  • 代表了人类可用的形式

因此,使用例如SHA1与原始字符串作为输入并获得二进制结果。 =>哈希。 从二进制散列得到9(或11)* 5位和使用下表:

00000 - > “0”
00001 - > “1”
...
01001 - >“9 “
01010 - > ”A“
...
11111 - > ”Z“

该表不使用一些字母可能我混了(如 ”L“ == ”L“可能会意外地读为“1”;因为您使用数字“0”,所以省略字母“Q”和“O”)。你需要10位数字加22个字符。

如果用户输入代码,则将所有小写字母替换为大写字母,例如“l”/“L”为“1”,因为这些必须是拼写错误。如果可能,请添加另外一个或两个字符作为校验和,以便检查其他拼写错误(交换为字符)。因此,您可以在前端显示错误消息,而无需执行任何解码/数据库查找。

+0

但哈希本身并不保证是唯一的。另一方面,SHA-1长于11个字符(甚至不考虑限制值),所以它可能实际上散列到所有给定输入的唯一值。 – 2010-09-29 12:04:23

+0

@Konrad:是的,它并不保证是唯一的。但是你可以计算这个概率,如果这个应用程序没有问题,它可能是一个解决方案,这使得在知道另一个代码时很难“猜测”一个代码。 – 2010-09-29 12:09:34

3

这里有一种可能性。

对于九个字符的代码,请在第一个数字后面插入一个随机偶数字母(B,D,F,...),并在结尾处插入两个随机数字。

对于十一个字符的代码,请在第一个数字后面插入一个随机的奇数字母(A,C,E,...),并保持原样。

在这两种情况下,您还可以使用ROT-13非噪声alpha和ROT-5数字来进一步更改代码,但我不确定这对您的目的是否有必要。

这样你最终会得到一个十二个字符的代码,如果需要的话,你可以反转。它是人类可读和独特的。正如你所说,它不是,NSA级别的加密,但它应该阻止临时旁观者。


如果你需要生成一个更确定的结果(即,无随机数)的哈希,你可以添加的东西依赖于输入数据。这是一种方法,可能还有数百种。考虑两种输入类型:

AB12345C6 
AB12345C678 

仍然插入字符在两种情况下,1后但要依赖于输入。添加了数字的位置136,走模10的,通过9

用得到0,作为一个查找到字符串“ABXVRWECPU”的九位数字代码或“OIYJTQLSDK”十一位数字代码来获得角色。然后,您可以在生成的代码中使用该字符来决定最初是9或11个字符的代码(真正的偏执会确保这些字符串不是以明文形式存储在代码中)。

对于要添加到第一种情况的两个数字,将A,C和B的函数(例如,xor'B'与147)加起来,然后将其添加到由64 ,51和23

采取模87的该再加入7 7和93

+1

伟大的思想家都认为... :( – 2010-09-29 12:04:54

+1

我同意,只有填充数字不能是随机的,但有一些散列(例如,总和%100),此外,偶数和奇数字母可能很容易被发现 – Sjoerd 2010-09-29 12:07:12

+0

@Sjoerd:什么是错的用随机数字结尾? – 2010-09-29 12:09:29