web-dev-qa-db-ja.com

Webプログラマーは暗号化について何を知っているべきですか?

Webサイト/ Webアプリケーションを構築するプログラマは暗号を理解する必要がありますか?ほとんどの暗号化アルゴリズムがどのように機能するのか私にはわかりません。md5/ des/aes/etcの違いを本当に理解していません。暗号化について深く理解する必要があると感じたことはありますか?

必要なかったのですが、何か足りないかな。私はソルト+ md5ハッシュを使用してパスワードを暗号化し、SSLを使用するようにWebサーバーに指示しています。それを超えて、私は他の多くを使用したとは言えませんし、確実に言うこともできません どうやって これらの方法は安全です。他の人が安全だと主張しているので、私はそれらを使用します。

これらの2つの単純な例以外に、Webプログラミングで暗号化を使用する必要性を見つけたことがありますか?

27
davidhaskins

Webプログラマーは、暗号化を自分で実装することを絶対にしないでくださいしようとする必要があることを知っている必要があります。

特に、これは、非セキュリティ専門家が暗号プリミティブに直接触れてはならないことを意味します。彼らはAESやSHA-1などのレベルで考えるべきではありません。代わりに、高レベルの関数を使用してメッセージを暗号化および署名し、パスワードを「ハッシュ」する必要があります。

どうして?それ以外の場合、人々は誤解して次のことを考えます。

  • AES-256は、ECBモードで使用している、または非ランダムIV値などを使用しているという事実にもかかわらず、「優れた暗号化」です(一部のモードでは、非ランダムだが一意のIVは問題ありません。そんなに。)
  • 複数のメッセージを暗号化するために同じ対称鍵を使用できます(さらに悪いことに、直接使用するために対称鍵をコードに格納します)。
    • また、鍵導出関数を使用せずに、パスフレーズを鍵として直接使用することを決定する場合もあります。
  • RSAを使用してデータを直接暗号化できます。
  • 単にパスワードを「ソルトおよびMD5」して、安全に保つことができます。 (レインボーテーブルが最も弱いリンクだと思う場合は、 もう一度考えてください 。)

上記の項目はどれも問題ありません。それが得られない場合は、10フィートのポールで暗号に触れてはいけません。 (AES-256 is 優れた暗号化ですが、適切に使用した場合に限ります。「重要なのはサイズではなく、それをどのように使用するかです。」:-))

どのような高水準関数について話しているのですか?個人的には、OpenPGP(保存データ用)またはSSL(移動中データ用)ライブラリの使用をお勧めします。これらのプロトコルは、非対称、対称、およびハッシュアルゴリズムの正しい使用を厳密に指定します。たとえば、OpenPGPの場合:

  • RSAを使用してデータを直接暗号化するのではなく、ランダムなセッション(対称)キー /メッセージ(これは重要)を生成し、RSAを使用してそのセッションキーを暗号化します。
  • キー導出関数を使用して、パスフレーズをキーに変換します。 (OpenPGPの用語では、これはS2Kと呼ばれますが、「鍵導出関数」がより標準的な用語だと思います。)
  • 良いモードの選択を処理するので、ECBを使用することはありません。
  • それはあなたのためにキー管理を処理するので、どのキーが信頼できるかなどについてアドホックな決定をする必要はありません。

要約:あなたがセキュリティの専門家ではなく、AES、またはSHA-1、または(天国は禁じられています)MD5のレベルで考えている場合、それは間違っています。独自のものをロールするのではなく、セキュリティ専門家(Bouncy Castleなど)が作成したライブラリを使用します。

私は決して暗号の専門家ではありませんが、自分のアドホックプロトコルを設計しようとしないように十分知っています。明確にするために、この投稿全体は、Cryptography 101の資料です。したがって、この投稿が100%意味をなさない場合は、暗号化の近くに行くべきではありません。

41

暗号化の基本(ハッシュとは何か、ソルトとは何か、この暗号化を解読するのがどれほど難しいかなど)以外は何も知る必要はありませんが、セキュリティについてはかなり知っている必要があります一般的な。

あなたが間違いなくウェブ開発者として注意しなければならない主なセキュリティ領域:

  1. SQLインジェクション。これはおそらく、Web開発者がシステムに穴を開けることができる最も危険な穴の1つです。
  2. クロスサイトスクリプティングとCookie。
  3. スパムボットとキャプチャ。
  4. SQLインジェクション。これがいかに重要であるかを十分に強調することはできません。
14
biziclop

すべてのエンジニアがセキュリティについて知っておくべきこととそれをどこで学ぶべきか と呼ばれるこの講演を見たことを覚えています。講演者はNeil Daswaniであり、彼が行ったGoogle Tech Talkであり、始めるのに最適な場所かもしれません!

ただし、Webプログラマーだけに当てはまるわけではありませんが、「プログラマーがセキュリティについて知っておくべきことは何ですか?」暗号についての基本以上のものを知る必要がないので(それが面白いほど)

4
user18041

暗号は多くの状況で役に立ちます。私たちが使用した例は、LAMPホストで使用するためにWin/IISホストによって作成および設定されたセッションCookieを暗号化することです。

(md5/sha1ハッシュではなく)暗号化を実装する場合は、対称暗号化と非対称暗号化の違いなど、いくつかの基本的な用語が重要です。 2つの違いを理解するとともに、復号化キーを適切に保存して保護するためにWeb開発者が何をする必要があるかを理解する必要があります。たとえば、共有ホストのように、完全な管理制御権がないホストにデプロイするアプリケーションを開発する場合と、すべての管理者が既知で信頼されているサーバーにデプロイする場合などです。

2
Michael

私の意見では、あなたのコードを攻撃している誰かが知っている暗号についてのすべてを知っているべきです。ハッシュ、ソルト、ランダムの非ランダム性、主要な暗号化アルゴリズム(RSA、3DES、AESなど)、SHA-1/MD-5/et al。を理解する必要があります。それらを記憶する必要はありませんが、少なくともハッシュアルゴリズムの有効性とハッシュアルゴリズムを強化する方法を知っておく必要があります。衝突と誤検知とは何かを知っている必要があります。暗号化アルゴリズムを暗唱することはできませんが、それらのベンチマークに精通している必要があります。対称暗号化と非対称暗号化、およびそれぞれをいつ使用するかについて説明および説明できるはずです。 PKIとは何か、およびその使用方法を知っている必要があります。認証局とは何か、それがサーバーとどのように相互作用するかを知っておく必要があります。

すべての詳細を知ることは、その背景を知ることほど重要ではありません。特定の事柄のベンチマークは何ですか(速度、強度、弱点など)。

これらの推奨事項は、上級または建築家レベルの情報を対象としています。オールを漕いでいるWebモンキーだけであれば、これを知る必要はありません。あなたの建築家はこのことを知っているべきです。サイトの設計、実装などを担当している場合は、これらの概念すべてに精通し、それらについてインテリジェントに会話できる必要があります。あなたはそれを教えることができる必要はなく、ただそれについての情報を受け入れて広めるだけです。

2
Joel Etherton

パスワードの保存には、MD5ではなく bcrypt (Blowfish)を使用する必要があります。 これははるかに遅いアルゴリズムです 、つまり、ハッカーが推測してチェックするのがはるかに困難であることを意味します。また、bcryptはwork factorをパラメーターとして使用します。つまり、新しいコンピューターが導入されるとさらに遅くなる可能性があるため、将来を見据えた組み込み機能が組み込まれています。 。

詳細は パスワードを安全に保存する方法 を参照してください。

2
chrisaycock

これらの種類の質問に対するかなり一般的な回答として、私は常に、自分の行動に遠隔に関連するあらゆることについて基本的な理解を持つようにすべきだと常に思っています。もちろん、実際に取り組んでいることに関する具体的な詳細な知識が必要です。特定の領域がどのように進化するか、「流行」になるもの、または将来必要になるものを予測することは非常に難しいので、少なくとも「聞いたことがある」ものの広い領域があると、多くのドアが開きます。

私がWebプログラミングで個人的に経験した限りでは、非対称暗号の基本的な概念が見つかりました。これは、内部で何が起こっているのかを理解するのに役立ちます。私はそれなしで生き残ったかもしれませんが、私は暗号と数学を楽しんでいると言わなければなりません。

0
Omar Kohl