首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从10位数的种子中生成9字节的数字

从10位数的种子中生成9字节的数字
EN

Stack Overflow用户
提问于 2017-05-17 16:43:26
回答 1查看 105关注 0票数 0

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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实现:

代码语言:javascript
复制
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()

例如:

代码语言:javascript
复制
>>> unique_id(12024561111) #White House phone number
'1614351BX'

非蛮力攻击需要解决基地-17 离散日志问题(mod 10000000259).这并不是特别困难,但并非琐碎,并可能足以劝阻偶然试图恢复原来的数字。您可以将p替换为另一个素数(并将a替换为相应的原根),只要p > 10^10p-1的十六进制表示形式是9十六进制数字或更少。如果从数字到标识符的转换保持在服务器端,那么偶然的攻击者将无法访问ap,这将增加一层“通过模糊的安全性”(安全性可疑,但总比没有)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44030562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档