web-dev-qa-db-ja.com

PHPおよびLinuxアプリと互換性のある適切なパスワードハッシュアルゴリズム

新しいサーバーシステムのパスワードハッシュ方式を探しています。ハッシュはPHPコードから生成され、PHPから、およびLinuxシステム上のいくつかのアプリケーションによって検証されます。

プレーンまたはソルト付きのMD5とSHA-1は良い解決策ではないことを知っています。今日、sha256cryptとsha512cryptは大丈夫だと聞いています。私はかつて、sha2cryptアルゴリズムが非常に簡単に解読されて、役に立たなくなることを読んだことがあります。 bcryptの推奨をよく耳にします。しかし、今でもbcryptに複数の問題がありました。 $ 2 $はもはや関連性がないようですが、$ 2a $と$ 2b $は私が理解しているように互換性がありません。そして、少なくともPHPは、$ 2b $アルゴリズムの$ 2a $プレフィックスを再利用して互換性をなくすことで、問題を修正することについて奇妙な理解を持っています。$ 2x $と$ 2yはわかりません$はPBKDFとscryptがサポートされていないようで、使用できません。

PHPは_password_hash_関数を使用してbcryptハッシュを生成できますが、独自に決定する_password_hash_もcryptも使用せず、sha256cryptまたはsha512cryptハッシュを作成できないようです。使用するアルゴリズム。すべてのアプリケーションがアルゴリズムをサポートしているわけではないので、アルゴリズムを指定したいと思います。

今のところ、sha512cryptアルゴリズムは、最初に互換性、次にセキュリティを考慮して、最も有望に見えます。 (単純に機能しない超安全なものはまだ役に立ちません。)しかし、PHPはそれらを生成できません。私はcrypt()でスタックし続けていますか? (それはそれがすることです:$ 1 $)

OSはUbuntu 14.04で、アプリケーションは現在のところexim、dovecot、proftpdです。 PHPバージョンは5.5.9です。

だから私は何をすべきですか?今は完全に混乱しています。

2
ygoe

サードパーティ製アプリケーションの制限についてはよくわかりませんが、質問にお答えします。

「いつまで信頼すべきアルゴリズムか」に焦点を当てる代わりに、ハッシュシステムをアップグレード可能にする必要があります。 SSLは20年前に発明されました。SSLの強みの1つは、新しい攻撃が明らかになるにつれて暗号が最初から置き換えられるように設計されていたことです。最近見たように、多くの暗号スイートが壊れて廃止されましたが、SSL自体は変更するように設計されていたため、継続しています。

これはそれほど難しいことではありません。ハッシュと一緒にハッシュアルゴリズムを保存するだけです。ハッシュアルゴリズムに欠陥が発見された場合は、新しいパスワードまたは変更されたパスワードに使用するハッシュアルゴリズムを変更し、次にユーザーが認証に成功したときに、新しいハッシュアルゴリズムを使用してハッシュを復元します。時間の経過とともに、ユーザーは新しいハッシュにアップグレードされます。

MD5とSHA1は壊れていると見なされており、新しいハッシュ実装では使用しないでください。 SHA256とSHA512は現在、信頼できるアルゴリズムです。 PHPでのサポートの検索にどのような問題があるのか​​はわかりませんが、どちらも直接暗号化拡張機能を使用してサポートされているようです。 http://php.net/manual/en/function.hash-algos.php

それ以外の場合は、それらをサポートするライブラリがどこかで見つかるはずです。

他の標準的な予防策が推奨されます。格納される各ハッシュには、ランダムに生成されたソルトの少なくとも128ビットを使用してください。ハッシュとは別の場所に格納されている単一のソルトである「コショウ」を追加することを検討する場合があります。

2
Steve Sether