我有一系列格式为的代码:
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 个字符)不得显而易见 - 它不需要加密强度高,只是对外行来说不透明即可。
是否有任何合适的散列(或其他)算法来执行此操作,或者有人对执行此操作的自定义方式有任何建议吗?
谢谢
最佳答案
这是一种可能性。
对于九个字符的代码,请在第一个数字后插入一个随机偶数字母(B、D、F...),在末尾插入两个随机数字。
对于 11 个字符的代码,请在第一个数字后插入一个随机奇数字母(A、C、E...),其余部分保持原样。
在这两种情况下,您还可以对非噪声阿尔法进行 ROT-13 并对数字进行 ROT-5 来进一步更改代码,尽管我不确定这对于您的目的是否必要。
这样,您最终会得到这两种情况的十二个字符代码,如果需要,您可以反转该代码。它是人类可读且独特的。正如您所说,它不是 NSA 级别的加密货币,但它应该可以阻止随意的旁观者。
如果您需要一个哈希来生成更具确定性的结果(即,没有随机数),您可以使添加的内容依赖于输入数据。这是一种方法,可能还有数百种方法。考虑两种输入类型:
AB12345C6
AB12345C678
在这两种情况下,仍然在 1
之后插入一个字符,但使其依赖于输入。将 1
、3
和 6
位置上的数字相加,并对其取模 10,得到 0 到 9。
使用它作为查找字符串“ABXVRWECPU”的九位代码或“OIYJTQLSDK”的十一位代码来获取字符。然后,您可以在生成的代码中使用该字符来决定它最初是九个字符的代码还是十一个字符的代码(真正偏执的人会确保这些字符串不会以明文形式存储在代码中)。
对于要添加到第一种情况的两个数字,将 A、C 的 ASCII 代码和 B 的函数相加(例如,将“B”与 147 进行异或),然后将其添加到由 64 形成的数字中, 51 和 23。
取模 87,然后加上 7,得到 7 到 93 之间的值。
关于hash - 如何唯一地散列/混淆 9-11 个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3821294/