URL の主キーをマスクするために zlib.crc32 または zlib.adler32 を安全に使用できますか?
-
25-09-2019 - |
質問
で ジャンゴのデザインパターン, 、著者は zlib.crc32 を使用して URL 内の主キーをマスクすることを推奨しています。いくつかの簡単なテストの後、crc32 は約半分の時間で負の整数を生成することに気付きました。これは URL での使用には望ましくないように思えます。zlib.adler32 はネガティブを生成しないようですが、次のように説明されています。 CRCよりも「弱い」.
- このメソッド (CRC または Adler-32) は、主キーの代替として URL で使用しても安全ですか?(すなわち、衝突安全性はありますか?)
- 「弱い」Adler-32 はこのタスクの満足のいく代替品でしょうか?
- 一体どうやってこれを逆転させるのですか?つまり、チェックサムから元の主キーをどのように判断するのでしょうか?
解決
問題は、値をハッシュされていません。問題は、キーにハッシュバックをマッピングしています。衝突がある場合でも、あなたは、未使用のハッシュを打つまで、あなたは常にインクリメント可能性があります。
理由ハッシュは、例えばために使用されますすでに適切なレコードを見つけるために使用することができ、キー(例えば、ユーザ名)がありますので、認証があります。その時点では、保存されたハッシュに対して与えられたハッシュ値を比較するだけの問題になります。あなたの代わりにキーをマスクするためにハッシュを使用している場合、それはちょうどそれを比較するよりもトリッキーになります。キーにハッシュ自体を回すと、このかかわらを解決します。
他のヒント
は、符号なし整数として32ビットCRC値を解釈することができます。
さらに調査すると、これは本当に悪いアイデアだと思います:
In [11]: s = set([zlib.crc32(str(x)) for x in xrange(20000000)])
In [12]: len(s)
Out[12]: 19989760
In [13]: 20000000 - len(s)
Out[13]: 10240
20,000,000主キーで10,240の衝突の
所属していません StackOverflow