我有一个独特的10位电话号码,我想从它生成一个9个字符独特的字母数字id。它不需要是可逆的,但相同的唯一字母数字id应该从相同的电话号码生成。
发布于 2017-05-17 20:30:51
这里有一种可能性。它为0到9999999999范围内的所有数字提供了一个独特的9个字符字母数字标识符,其方式是不容易计算的(只有100亿个可能的数字,真正的安全是不可能的,但它很容易使普通用户难以使用)。它基于使用原根mod p进行模幂的方法,其中p是被选择为比10^10大的素数。
1)首先将1加到数字中,以确保它不是0
2)然后将原根提高到这个数字,mod p。这很容易通过平方进行模幂运算。
3)用十六进制写出结果。
( 4)如果结果小于9位数,则由9进行Pad。
下面是一个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 离散日志问题(mod 10000000259).这并不是特别困难,但并非琐碎,并可能足以劝阻偶然试图恢复原来的数字。您可以将p替换为另一个素数(并将a替换为相应的原根),只要p > 10^10和p-1的十六进制表示形式是9十六进制数字或更少。如果从数字到标识符的转换保持在服务器端,那么偶然的攻击者将无法访问a和p,这将增加一层“通过模糊的安全性”(安全性可疑,但总比没有)。
https://stackoverflow.com/questions/44030562
复制相似问题