Hash 如何唯一地散列/模糊9-11个字符

Hash 如何唯一地散列/模糊9-11个字符,hash,Hash,我有以下格式的一系列代码: AA12345A1 i、 e.:[a-z]{2}[0-9]{5}[a-z][0-9] 及 i、 e.:[a-z]{2}[0-9]{5}[a-z][0-9]{3} 我需要创建一个新的“代码”的任何格式,从上述任何一种格式到格式,以掩盖以1个数字结尾的代码和以3个数字结尾的代码之间的差异(这会向用户显示我需要隐藏的信息) 新代码格式的约束条件包括: 它们必须是人类可以使用的(因此使用大写和小写字母是一个坏主意,在可用性方面,它们也应该尽可能短) 它们必须始终是唯一的(

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

AA12345A1
i、 e.:
[a-z]{2}[0-9]{5}[a-z][0-9]

i、 e.:
[a-z]{2}[0-9]{5}[a-z][0-9]{3}

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

新代码格式的约束条件包括:

  • 它们必须是人类可以使用的(因此使用大写和小写字母是一个坏主意,在可用性方面,它们也应该尽可能短)
  • 它们必须始终是唯一的(9或11个字符的代码不应产生相同的输出)
  • 它只需要一个单向散列,我永远不需要得到原始代码回来
  • 原始代码的长度(9或11个字符)不能太明显-它不需要加密能力强,只是对外行来说不透明
有没有合适的散列(或其他)算法可以做到这一点,或者有没有人对定制的方法有什么建议

谢谢

您有两项任务:

  • 创建散列
  • 以人类可用的形式表示
因此,使用例如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”,因为这些字母必须是打字错误。如果可能,添加另外一个或两个字符作为校验和,以便您可以检查其他打字错误(替换为字符)。因此,您可以在前端显示错误消息,而无需执行任何解码/数据库查找

这里有一种可能性

对于九个字符的代码,在第一个数字后插入一个随机偶数字母(B、D、F……),在末尾插入两个随机数字

对于11个字符的代码,在第一个数字后插入一个随机奇数字母(a、C、E……),其余数字保持原样

在这两种情况下,您也可以ROT-13非噪声字母和ROT-5数字来进一步更改代码,尽管我不确定这对您的目的是必要的

这样,两种情况下都会得到一个12个字符的代码,如果需要,可以反转。它是人类可读的和独特的。正如你所说,这不是国家安全局级别的密码,但它应该能阻止随便的旁观者


如果需要生成更具确定性的结果(即,没有随机数)的散列,则可以使添加的内容依赖于输入数据。这里有一种方法,可能还有数百种。考虑两种输入类型:

AB12345C6
AB12345C678
在这两种情况下,仍然在
1
后面插入一个字符,但使其取决于输入。将位置
1
3
6
处的数字相加,取其模10得到0到9

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

对于要添加到第一种情况的两个数字,将A、C和B函数的ASCII码相加(例如,带147的异或'B',然后将其添加到由64、51和23组成的数字中


取其模-87,然后加7,得到一个介于7和93之间的值。

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

  • 秘密地随机挑选字母表的一半表示9个字符,另一半表示11个字符
  • 从正确的一半向字符串预加一个随机字母(即,如果是9个字符的字符串,则从9个字符的一半向字符串预加一个字母)
  • 如果字符串为9个字符,则附加2个随机数字
然后,在使用时,您知道如果第一个字符来自一半,即9个字符,则可以丢弃最后两个数字


不过,每一个字符串都会有12个字符。

但是哈希本身并不能保证是唯一的。另一方面,SHA-1的长度超过11个字符(即使不考虑限制值),因此它实际上可能会对所有给定的输入哈希为唯一值。@Konrad:是的,不能保证它是唯一的。但是你可以计算概率,如果应用程序可以的话,它可以是一个解决方案,当知道另一个代码时,很难“猜测”一个代码。我同意。只有填充数字不能是随机的,而是一些散列(例如,总和%100)。此外,偶数和奇数字母可能很容易被发现。根据定义,如果输入相同,哈希函数总是给出相同的结果。使用随机数时,如果再次运行,哈希可能会不同。@Sjoerd,为什么不使用随机数?基于插入的alpha,它们只是被忽略了,所以它们是什么并不重要。如果你的意思是你想确保同一个来源给出相同的结果,我理解,但是这封信也不能是随机的。我将添加另一个更确定的哈希。@Sjoerd我同意偶数/奇数。我看不出随机数有什么问题,你不会因为增加了数字而产生冲突,因为字母表是9比11的一半codes@sjoerd:从这个问题来看,对我来说,真正的哈希并不是一个很难的要求@paxdiablo:当你这么做的时候,修复偶数/奇数字母的问题(有点太明显了)。此外,为了让它完全确定,你必须从字符串上的实际字符中推断出起始字母(可能使用类似CRC-128的东西会
AB12345C6
AB12345C678