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


27

Webサイト/ Webアプリケーションを構築するプログラマーは暗号化を理解すべきですか?ほとんどの暗号アルゴリズムがどのように機能するのか分かりませんし、md5 / des / aes / etcの違いを本当に理解していません。暗号化の詳細な理解が必要な人はいますか?

私はそれを必要としませんでした、しかし、私はおそらく私が何かを見逃しているのではないかと思います。パスワードを暗号化するためにsalt + md5ハッシュを使用し、WebサーバーにSSLを使用するように指示しました。それを超えて、私は他の多くを使用したとは言えず、これらの方法がどれほど安全であるかを確実に言うこともできません。他の人が彼らが安全だと主張するので、私はそれらを使うだけです。

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


4
彼らはそれをしてはならないことを十分に知っている必要があります。
SLaks

@SLaks:+1 100%賛成。この理由を詳しく説明するために、このスレッドに対する回答を書きました。
クリスジェスターヤング

回答:


41

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%意味をなさない場合は、暗号化に近づかないでください。


4
驚くばかり。「もう一度考えてください」にリンクされたブログ投稿が気に入りました。 chargen.matasano.com/chargen/2007/9/7/...
davidhaskins

+1、ただし同じ対称キーを複数回使用しても問題ありません。それがIVの目的です(そうでない場合は必要ありません)。
orip

1
さらに、Scrypt(およびその他の)名声のColin Percivalには、「Cryptographic Right Answers」と呼ばれるすばらしい記事があります。SSLには非常に問題があります(キーの取り消しを実装するのは非常に困難です)。詳細:daemonology.net/blog/...
oriPを

@orip同意しますが、異なるIVで同じキーを使用することは、メッセージが選択された対称暗号のブロックサイズよりも長い場合には、通常、異なるキーではなく、前のメッセージに使用されたIVを追跡するためのコンテキスト。また、Colin Percivalの記事にも同意してください。
クリスジェスターヤング14

1
@Ajoyリンクをより関連性の高いものに変更しました。
クリスジェスターヤング

14

暗号化に関する非常に基本的なこと(ハッシュとは何か、塩とは何か、この暗号化を解読するのがどれくらい難しいかなど)以外は何も知る必要はありませんが、一般的な。

Web開発者として確実に意識しなければならない主なセキュリティ分野:

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

あなたがしていることについて何も理解していないことは非常に危険です。メッセージダイジェストハッシュと暗号化ハッシュの違いが何を台無しにするかわからない。塩の作り方がわからないと、台無しになります。
シークレット

@ user1525それが、暗号化の非常に基本的なことでした。encryuptionアルゴリズムの実際の動作を知る必要はありません。
biziclop

私はその反応に感謝し、SQLインジェクションやその他の攻撃については同意しますが、暗号化については本当に質問していました。
-davidhaskins

2
@davidhaskinsええ、各レベルは前のレベルに基づいているため、指摘する価値があると思いました。より基本的なレベルでアプリケーションを保護できない場合、AESがどのように機能するかを知ることは何の価値もありません。私の経験では、これは多くの開発者が陥るtrapであり(何度かやりました)、暗号化に集中し、長いセキュリティチェーンでの役割を見失います。
biziclop


2

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

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


2

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

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

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


2

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

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


0

この種の質問に対する非常に一般的な答えとして、私は常に、あなたがやっていることにリモートで関連するものについての基本的な理解を持つようにすべきだと思います。もちろん、実際に作業していることに関する特定の詳細な知識が必要です。特定の領域がどのように進化するのか、「ファッション」になるのか、または将来必要になるのかを予測するのは非常に難しいので、少なくとも「聞いたことがある」ものの広い領域を持つことは維持されます多くのドアが開きます。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.