我有一個獨特的10位電話號碼,我想從它生成一個9個字符的唯一字母數字ID。它不需要是可逆的,但應該從相同的電話號碼生成相同的唯一字母數字ID。從10位數字的種子生成9字節的alphunumeric
0
A
回答
1
這是一種可能性。它爲0到9999999999範圍內的所有數字提供了一個唯一的9個字符的字母數字標識符,這樣反相不易計算(只有100億個可能的數字,真正的安全性是不可能的,但很容易使其難以實現對於臨時用戶)。它是基於使用一個原始根模p
,其中p
是選擇爲比10^10
大的素數模冪:
1)首先添加1〜數,以確保它不爲0
2)然後將原始根提升到這個數字,mod p
。這是很容易通過平方
3通過'X'
做 與模冪)收件結果以十六進制
4)墊如果結果少於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 > 10^10
和p-1
的十六進制表示的長度爲9個十六進制數字或更少,就可以用另一個素數替換p
(並且a
通過相應的原始根)。如果從服務器端將數字轉換爲標識符,那麼偶然的攻擊者將無法訪問a
和p
,這會增加一層「安全通過隱匿」(可疑的安全性,但總比沒有好)。
+0
非常感謝,這就是我一直在尋找的。 – user1625348
相關問題
- 1. 如何生成一個9位數字
- 2. random.nextBytes(字節)如何生成字節之後,我們有種子
- 3. 從0到9生成數字(Prolog)
- 4. 在NSIS中生成一個10位字母數字字符串
- 5. 生成隨機數字:更新種子
- 6. 10位數字而不是9位UID的Facebook UID
- 7. 如何在Java中生成一個隨機的9位數字?
- 8. 生成9位數字ID不帶數據庫序列
- 9. 從流生成字節數組
- 10. C++中種子的確定性隨機字節/字符串生成器
- 11. 生成PDF字節數組
- 12. 從asp.net中的字節生成pdf
- 13. .net中的10位數字
- 14. 如何在Android中生成唯一的10位字母數字值?
- 15. 生成一個10位數字的隨機確認字符串php
- 16. 生成6位數字
- 17. 生成唯一的10位數
- 18. 字節數組中的原子集位
- 19. 生成隨機數字的種子是什麼?
- 20. 生成與7位的數字與前
- 21. 從2字節讀取14位數字
- 22. 從字節數組中獲取字節塊的起始位置
- 23. 比較兩個數字9 <10
- 24. 從字符串或字節數組中生成javax.wsdl.Definition
- 25. 獲取從位圖的字節數組
- 26. 從種子生成的唯一編號
- 27. 用1-9的所有數字生成隨機整數
- 28. ASP.NET MVC從字節生成PDF []
- 29. Jax-RS從字節[]生成圖像
- 30. 從(0,1)播種統一生成的數字?
你似乎矛盾自己。一方面,你說你想從電話號碼中產生*獨特的*字母數字標識符,然後你說「它不需要是可逆的」。如果標識符是唯一的,那麼映射是可逆的(如果沒有其他的話,通過暴力)。無論如何:1)什麼編程語言? 2)你有什麼嘗試? –
爲了唯一性嘗試使用某種形式的加密;不同的輸入保證產生獨特的輸出。對於字母數字輸出,請嘗試使用加密輸入的Base32轉換。不要將電話號碼視爲字符,而應視爲整數,這會減少所需加密的位大小。查看格式保留加密以獲得進一步幫助。 – rossum