我有一个唯一的10位数电话号码,我想从中生成一个9个字符的唯一字母数字ID。它不需要是可逆的,但应从同一电话号码生成相同的唯一字母数字ID。
答案 0 :(得分:1)
这是一种可能性。它为0到9999999999范围内的所有数字提供了一个唯一的9个字符的字母数字标识符,使得反向不易计算(只有100亿个可能的数字,真正的安全性是不可能的,但它很容易使其变得困难适用于临时用户)。它基于使用原始根mod p
的模幂运算,其中p
是选择大于10^10
的素数:
1)首先在数字上加1,以确保它不是0
2)然后将原始根提升为此数字mod p
。这很容易做到
通过平方模块取幂
3)将结果写成十六进制
4)如果结果少于'X'
个数字,请按9
填充。
这是一个Python实现:
p = 10000000259 #prime
a = 17 #primitive root mod p
#assumes num is an integer in range 0 to 9999999999:
def unique_id(num):
num += 1 #so num is in range 1 to p-1
num = pow(a,num,p)
h = hex(num)[2:]
return (h + 'x'*(9 - len(h))).upper()
例如:
>>> unique_id(12024561111) #White House phone number
'1614351BX'
非暴力攻击需要解决基础-17 discrete log问题(mod 10000000259)。这并不是特别困难,但并非重要,可能足以劝阻偶然尝试恢复原始号码。您可以将p
替换为另一个素数(并且a
替换相应的原始根),只要p > 10^10
和p-1
的十六进制表示是9个十六进制数字或更少长度。如果从数字到标识符的转换保留在服务器端,那么偶然的攻击者就无法访问a
和p
,这将增加一层“通过默默无闻的安全性”(可疑的安全性,但是总比没事好。