私は一意の10桁の電話番号を持っているので、それから9文字の固有の英数字のIDを生成したい。それは可逆である必要はありませんが、同じ電話番号から同じ一意の英数字のIDを生成する必要があります。10桁の数字のシードから9バイトの英数字を生成する
答えて
ここに1つの可能性があります。逆数が簡単に計算できないように0から9999999999の範囲のすべての数字にユニークな9文字の英数字の識別子を与えます(100億の可能な数だけ真のセキュリティは不可能ですが、難しくするのは簡単ですカジュアルユーザーの場合)。それはp
が10^10
よりも大きくなるように選ばれた素数である原始根のモッズp
を使用して、べき乗剰余演算に基づいています。
1)まず、それは0
ていないことを確認するために、数に1を加えます2)次に、プリミティブのルートをこの数字に変更します。修飾子はp
です。結果がより少ない9
数字を持っている場合、これは)進
4に結果を書く)'X'
によってパッド
3を二乗することにより、べき乗剰余演算で を行うのは簡単です。例えば
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()
:ここ
は、Python実装である
>>> unique_id(12024561111) #White House phone number
'1614351BX'
非ブルートフォース攻撃は、ベース17 discrete log問題(MOD 10000000259)を解決する必要があります。これは特に難しいことではありませんが、ささいなことではなく、元の番号を回復しようとする偶然の試みを断念するのにはおそらく適切です。 p > 10^10
およびp-1
の長さが9桁の16進数である限り、p
を別の素数(および対応する基本ルートによってa
)に置き換えることができます。数字から識別子への変換がサーバー側に残っていると、偶然の攻撃者はa
とp
にアクセスすることができず、「不明瞭なセキュリティ」のレイヤーを追加することになります。
ありがとう、これは私が探していたものです。 – user1625348
- 1. ID 16桁の数字から生成
- 2. 英数字テキストボックスに9桁の数字を入力する方法を制限する方法
- 3. Codeignitor:英数字のIDを生成
- 4. C++で6桁の数字を生成
- 5. 10桁の数字から連続する4桁の数字を取得する
- 6. 英数字の文字列から数字を抽出する
- 7. バッチファイル - ランダム10桁数字
- 8. 00から24までの2桁の数字を生成
- 9. 英数字6桁以上の空白と1桁の英数字の正規表現
- 10. Javaで8バイトの数字を生成
- 11. PHP固有の10桁の数字str_shuffle
- 12. 10桁の乱数を生成
- 13. 長さ10の一意のランダムな英数字の主キーを生成
- 14. Rubyで英数字シーケンスを生成
- 15. すべてのX桁の数字のセットを生成する
- 16. 1桁または2桁の正規表現、任意の非英数字、2つの既知の英字
- 17. 10桁の数字を16進数の文字列に変換する
- 18. ユニークな英数字キー生成ツール
- 19. 文字を英数字と非英数字に分割する
- 20. 英数字のシーケンスを生成するjavascript
- 21. 小数点第2位の10桁の数字が必要
- 22. ユニークな5文字の英数字の文字列を作成
- 23. jsfで2桁の10進数で数字を表示
- 24. Perlの正規表現\ d +と[0-9]演算子は、英数字の文字列に1桁の数字のみを表示します
- 25. 二桁の数字
- 26. 10桁の数字を暗号化/復号化する
- 27. 10桁の数字パズルを計算するアルゴリズム
- 28. 数字のリストから値を生成
- 29. 数字からの時刻の生成
- 30. 10進数を含む桁数制限のある数字の正規表現
あなたは自分自身と矛盾しているようです。一方では、電話番号から*ユニーク*の英数字の識別子を生成したいとし、それから "それは可逆である必要はありません"と言います。識別子が一意である場合、マッピングは可逆的です(他に何もない場合はブルートフォースによって)。いずれにしても、1)どのようなプログラミング言語ですか? 2)何を試しましたか? –
一意性のために、ある形式の暗号化を試してください。独自の出力を生成するために異なる入力が保証されています。英数字出力の場合は、暗号化された入力のBase32変換を試してください。電話番号を文字として扱うのではなく、整数で指定すると、必要な暗号化のビットサイズが小さくなります。さらなるヘルプのために、フォーマットを保存する暗号を見てください。 – rossum