- ベストアンサー
pythonのhashlib,hmacの一意性
pythonのhashlib,hmacを使って、 key = "XNk5iuS?M+0t4k=x8Oj(r1VTkJ~HjoW" hmac.new(key, 'password', hashlib.sha512).hexdigest() のような感じでパスワードを保存しています。 ログイン時も入力されたパスワードを上記の式で変換し、それと等しい物があるか判断しています。 そこで質問なのですが、これが一意にならないことってあるのでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
「一意」というのはどういうことを指していますか? 'password' が一定ならば、常に同じHMAC値になる(計算するたびに違う値になったりしない)ことが保証されるのか? ということなら、それはYESです。PythonのhmacはRFC2104のアルゴリズムでHMACを計算するので、使用ハッシュ関数がsha1/sha256/sha512 のような「一意」のものなら、それが保証されます。 'password' が違えば常に違うHMAC値になるかと言えば、それは保証されません。ごく低い確率で同じHMAC値となる可能性はあります。しかし、少なくとも、攻撃者が意図的にそのような値を出力させることは非常に困難です。HMACやSHA256はそれに対抗するためのものなので。 * * * なお、HMACはもともと鍵付きでメッセージ認証をするためのもので、必ずしもパスワードを不可逆な状態にして保存するために意図して設計されてるわけではないことに注意してください。もちろん、何も暗号化しないよりははるかに安全ですが、運用がまずいと思わぬ脆弱性が生まれる可能性があります。たとえば、使用するkeyが全ユーザで共通なら、同じパスワードのユーザでは同じHMACが生成されてしまいますので、ユーザ数が大きく同じパスワードを設定しているユーザが存在する確率が高い環境では、HMAC化されたパスワード一覧が漏洩すると問題があります。これに対抗するためには、ユーザ毎に違うkeyにする必要があります。 パスワード認証のために、パスワードを不可逆な状態で保存することが応用の一つとして明確に宣言していている関数は、PBKDF2 (RFC2898) です。やってることはHMACに近いですしユーザ毎にkey相当(PBKDF2では saltと呼んでます)を違うようにしなければならないという点は同じですが、それが明記されていますし、細かい点で違います。
その他の回答 (1)
- copymaster
- ベストアンサー率81% (83/102)
#1 の回答者さんが大変素晴らしい解説をされています。 質問者のhymsさんは、きちんとお礼を言いましょう。 そして、新しく質問を投稿する時は、前の質問をクローズしてからにしましょう。それがマナーというものです。 ↓ http://okwave.jp/qa/q6584298.html http://okwave.jp/qa/q6569741.html