从10位数的种子

时间:2017-05-17 16:43:27

标签: random uniqueidentifier

我有一个唯一的10位数电话号码,我想从中生成一个9个字符的唯一字母数字ID。它不需要是可逆的,但应从同一电话号码生成相同的唯一字母数字ID。

1 个答案:

答案 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^10p-1的十六进制表示是9个十六进制数字或更少长度。如果从数字到标识符的转换保留在服务器端,那么偶然的攻击者就无法访问ap,这将增加一层“通过默默无闻的安全性”(可疑的安全性,但是总比没事好。