我怎样才能唯一地散列/混淆9-11个字符

时间:2010-09-29 11:48:02

标签: hash

我有以下格式的一系列代码:

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个字符)不能显而易见 - 它不需要加密强大,只是对外行不透明。

是否有任何合适的哈希(或其他)算法来执行此操作,或者是否有人建议采用自定义方式执行此操作?

由于

3 个答案:

答案 0 :(得分:3)

这是一种可能性。

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

对于十一个字符的代码,在第一个数字后插入一个随机的奇数字母(A,C,E,...),其余部分保持不变。

在这两种情况下,你也可以ROT-13非噪音alphas和ROT-5数字进一步改变代码,虽然我不确定你的目的是否必要。

这样你最终得到了两个案例的十二个字符代码,如果需要你可以反转。它具有人类可读性和独特性。正如你所说,它不是NSA级别的加密,但它应该阻止随便的旁观者。


如果您需要一个产生更确定结果的哈希值(即没有随机数),您可以根据输入数据添加添加的内容。这是一种方式,可能还有数百种。考虑两种输入类型:

AB12345C6
AB12345C678

在两种情况下仍然在1之后插入一个字符,但要使其依赖于输入。在位置136上添加数字,并取其中的模数10得到0到9。

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

对于要添加到第一种情况的两位数字,将A,C的函数和B的函数相加(例如,xor'B'和147),然后将其添加到由64形成的数字中, 51和23。

取模8的模数然后加7得到7到93之间的值。

答案 1 :(得分:2)

一种非常简单的混淆方法是:

  • 秘密地随机挑选一半字母表示9个字符,另一半表示11个字符。
  • 从正确的一半到字符串前面加一个随机字母(例如,如果它是9个字符串,则前面加上9个字符的一半字母)
  • 如果字符串是9个字符,则附加2个随机数字

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

你最终会为每个字符串添加12个字符。

答案 2 :(得分:0)

您有两项任务:

  • 创建哈希
  • 以人类可用的形式呈现

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

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

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

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