2009-03-29 15 views
2

ユーザーがリンクをクリックすることで自分のメールアドレスを検証できるようにします。私はこのメールを送っていたときのリンクはPythonでの双方向ハッシングのベストプラクティス?

http://www.example.com/verifyemail?id=some-random-string

ようになり、私は簡単にユーザーの行ID、整数からこの「いくつかのランダム文字列」を生成することができるようにしたいです。ユーザーがこのリンクをクリックすると、その整数が返されます。

「some-random-string」は、可能な限り不透明で推測不可能である必要があります。


最後に、これは私が

def p3_encrypt_safe(plain, key): 
    return base64.urlsafe_b64encode(p3_encrypt(plain, key)) 

に定住し、安全なエンコーディングは私ですBASE64のhttp://www.nightsong.com/phr/crypto/p3.py 添加から素敵な暗号ライブラリを使用したものです。

答えて

4

暗号化を使用してください。それはまさにそのために設計されたものです。 Blowfish、AES、さらにはDES3の場合でも特に高いセキュリティを必要としない場合

また、電子メールアドレスのSHA-256またはSHA-512(または何でも)ハッシュを計算し、電子メールアドレス自体とともにデータベースに格納することもできます。そうすれば、ハッシュをキーとして電子メールアドレスを調べることができます。

+1

IDのSHAハッシュは、暗号化されたIDよりやや扱いが簡単です。あなたのデータベースにすべてのハッシュを保存し、取得したハッシュとそれらのいずれかを比較してください。 –

5

あなたの最良の選択は、ユーザーのデータの一部のハッシュ(一方向性関数)を生成することです。ユーザが容易(ハッシュを逆転できるよう、

>>> import hashlib 
>>> hashlib.sha1('3').hexdigest() 
'77de68daecd823babbb58edb1c8e14d7106e83bb' 

しかし、唯一の行IDのあなたの擬似乱数列を基づかことは非常に安全ではありません。たとえば、ユーザーの行IDのハッシュを生成するために、次のようなものを使用することができますtry googling 77de68daecd823babbb58edb1c8e14d7106e83bb)の短い文字列です。

ここでの単純な解決策は、ハッシュされた文字列を「ソルト」することです。つまり、ハッシュされたすべての値に同じ秘密の文字列を追加することです。たとえば:

>>> hashlib.sha1('3' + '[email protected]' + 'somestringconstant').hexdigest() 
'b3ca694a9987f39783a324f00cfe8279601decd3' 

あなたgoogle b3ca694a9987f39783a324f00cfe8279601decd3は、おそらく唯一の結果は証拠ではありません。この回答:-)、へのリンクが、このハッシュは非常にユニークであることを良いヒントになります。