Webプログラマーは、自分で暗号化を実装しようとしてはならないことを知っている必要があります。
特に、非セキュリティ専門家が暗号プリミティブに直接触れてはならないことを意味します。彼らは、AES、SHA-1などのレベルで考えるべきではありません。代わりに、メッセージを暗号化して署名し、パスワードを「ハッシュ」するために高レベルの機能を使用する必要があります。
どうして?そうしないと、人々は次のように誤解してしまうからです。
- AES-256は、ECBモードで使用している、または非ランダムIV値などを使用しているという事実にもかかわらず、「優れた暗号化」です(一部のモードでは、ランダムではないが固有のIVでも構いません。そんなに。)
- 複数のメッセージを暗号化するために同じ対称キーを使用できます(さらに悪いことに、直接使用するために対称キーをコードに保存します)。
- 彼らは、キー派生関数を使用せずに、パスフレーズをキーとして直接使用することを決定するかもしれません。
- RSAを使用してデータを直接暗号化できます。
- パスワードを単に「ソルトおよびMD5」して、安全に保つことができます。(レインボーテーブルが最も弱いリンクだと思う場合は、もう一度考えてください。)
同じページにいるだけで、上記の項目はどれも大丈夫ではありません。それが得られない場合は、10フィートの棒で暗号に触れるべきではありません!(AES-256 は優れた暗号化ですが、適切に使用する場合のみです。「重要なのはサイズではなく、それを使用することです。」:-))
どんな高レベルの機能について話しているのですか?個人的には、OpenPGP(保存データ用)またはSSL(移動中データ用)ライブラリの使用をお勧めします。これらのプロトコルは、非対称、対称、およびハッシュアルゴリズムの正しい使用を厳密に指定します。たとえば、OpenPGPの場合:
- RSAを使用してデータを直接暗号化するのではなく、メッセージごとにランダムセッション(対称)キーを生成し(これは重要です)、RSAを使用してそのセッションキーを暗号化します。
- キー派生関数を使用して、パスフレーズをキーに変換します。(OpenPGPの用語では、S2Kと呼ばれますが、「キー派生関数」はより標準的な用語だと思います。)
- 良いモードの選択を処理するため、ECBを使用することはありません。
- それはあなたのために鍵管理を処理するので、どの鍵が信頼できるかなどについてアドホックな決定をする必要はありません。
要約:セキュリティの専門家ではなく、AES、SHA-1、または(天国では禁じられている)MD5のレベルで考えている場合、あなたはそれを間違っています。セキュリティ専門家(Bouncy Castleなど)が作成したライブラリを使用します。このライブラリは、独自のローリングではなく、セキュリティ専門家(暗号化用のOpenPGP、パスワードハッシュ用のbcryptまたはscryptなど)によって設計されたプロトコルを実装します。
私は暗号の専門家ではありませんが、独自のアドホックプロトコルを設計しようとしないように十分に知っています。明確にするために、この投稿全体は暗号101の資料です。したがって、この投稿が100%意味をなさない場合は、暗号化に近づかないでください。