Webサイト/ Webアプリケーションを構築するプログラマは暗号を理解する必要がありますか?ほとんどの暗号化アルゴリズムがどのように機能するのか私にはわかりません。md5/ des/aes/etcの違いを本当に理解していません。暗号化について深く理解する必要があると感じたことはありますか?
必要なかったのですが、何か足りないかな。私はソルト+ md5ハッシュを使用してパスワードを暗号化し、SSLを使用するようにWebサーバーに指示しています。それを超えて、私は他の多くを使用したとは言えませんし、確実に言うこともできません どうやって これらの方法は安全です。他の人が安全だと主張しているので、私はそれらを使用します。
これらの2つの単純な例以外に、Webプログラミングで暗号化を使用する必要性を見つけたことがありますか?
Webプログラマーは、暗号化を自分で実装することを絶対にしないでくださいしようとする必要があることを知っている必要があります。
特に、これは、非セキュリティ専門家が暗号プリミティブに直接触れてはならないことを意味します。彼らはAESやSHA-1などのレベルで考えるべきではありません。代わりに、高レベルの関数を使用してメッセージを暗号化および署名し、パスワードを「ハッシュ」する必要があります。
どうして?それ以外の場合、人々は誤解して次のことを考えます。
上記の項目はどれも問題ありません。それが得られない場合は、10フィートのポールで暗号に触れてはいけません。 (AES-256 is 優れた暗号化ですが、適切に使用した場合に限ります。「重要なのはサイズではなく、それをどのように使用するかです。」:-))
どのような高水準関数について話しているのですか?個人的には、OpenPGP(保存データ用)またはSSL(移動中データ用)ライブラリの使用をお勧めします。これらのプロトコルは、非対称、対称、およびハッシュアルゴリズムの正しい使用を厳密に指定します。たとえば、OpenPGPの場合:
EME-PKCS1-v1_5
)。 RSAにとってパディングは非常に重要です。 ( v1.5パディングを使用しても問題ないと考える人もいますOAEPの方が良いと考える人もいます。 )要約:あなたがセキュリティの専門家ではなく、AES、またはSHA-1、または(天国は禁じられています)MD5のレベルで考えている場合、それは間違っています。独自のものをロールするのではなく、セキュリティ専門家(Bouncy Castleなど)が作成したライブラリを使用します。
私は決して暗号の専門家ではありませんが、自分のアドホックプロトコルを設計しようとしないように十分知っています。明確にするために、この投稿全体は、Cryptography 101の資料です。したがって、この投稿が100%意味をなさない場合は、暗号化の近くに行くべきではありません。
暗号化の基本(ハッシュとは何か、ソルトとは何か、この暗号化を解読するのがどれほど難しいかなど)以外は何も知る必要はありませんが、セキュリティについてはかなり知っている必要があります一般的な。
あなたが間違いなくウェブ開発者として注意しなければならない主なセキュリティ領域:
すべてのエンジニアがセキュリティについて知っておくべきこととそれをどこで学ぶべきか と呼ばれるこの講演を見たことを覚えています。講演者はNeil Daswaniであり、彼が行ったGoogle Tech Talkであり、始めるのに最適な場所かもしれません!
ただし、Webプログラマーだけに当てはまるわけではありませんが、「プログラマーがセキュリティについて知っておくべきことは何ですか?」暗号についての基本以上のものを知る必要がないので(それが面白いほど)
暗号は多くの状況で役に立ちます。私たちが使用した例は、LAMPホストで使用するためにWin/IISホストによって作成および設定されたセッションCookieを暗号化することです。
(md5/sha1ハッシュではなく)暗号化を実装する場合は、対称暗号化と非対称暗号化の違いなど、いくつかの基本的な用語が重要です。 2つの違いを理解するとともに、復号化キーを適切に保存して保護するためにWeb開発者が何をする必要があるかを理解する必要があります。たとえば、共有ホストのように、完全な管理制御権がないホストにデプロイするアプリケーションを開発する場合と、すべての管理者が既知で信頼されているサーバーにデプロイする場合などです。
私の意見では、あなたのコードを攻撃している誰かが知っている暗号についてのすべてを知っているべきです。ハッシュ、ソルト、ランダムの非ランダム性、主要な暗号化アルゴリズム(RSA、3DES、AESなど)、SHA-1/MD-5/et al。を理解する必要があります。それらを記憶する必要はありませんが、少なくともハッシュアルゴリズムの有効性とハッシュアルゴリズムを強化する方法を知っておく必要があります。衝突と誤検知とは何かを知っている必要があります。暗号化アルゴリズムを暗唱することはできませんが、それらのベンチマークに精通している必要があります。対称暗号化と非対称暗号化、およびそれぞれをいつ使用するかについて説明および説明できるはずです。 PKIとは何か、およびその使用方法を知っている必要があります。認証局とは何か、それがサーバーとどのように相互作用するかを知っておく必要があります。
すべての詳細を知ることは、その背景を知ることほど重要ではありません。特定の事柄のベンチマークは何ですか(速度、強度、弱点など)。
これらの推奨事項は、上級または建築家レベルの情報を対象としています。オールを漕いでいるWebモンキーだけであれば、これを知る必要はありません。あなたの建築家はこのことを知っているべきです。サイトの設計、実装などを担当している場合は、これらの概念すべてに精通し、それらについてインテリジェントに会話できる必要があります。あなたはそれを教えることができる必要はなく、ただそれについての情報を受け入れて広めるだけです。
パスワードの保存には、MD5ではなく bcrypt (Blowfish)を使用する必要があります。 これははるかに遅いアルゴリズムです 、つまり、ハッカーが推測してチェックするのがはるかに困難であることを意味します。また、bcryptはwork factorをパラメーターとして使用します。つまり、新しいコンピューターが導入されるとさらに遅くなる可能性があるため、将来を見据えた組み込み機能が組み込まれています。 。
詳細は パスワードを安全に保存する方法 を参照してください。
これらの種類の質問に対するかなり一般的な回答として、私は常に、自分の行動に遠隔に関連するあらゆることについて基本的な理解を持つようにすべきだと常に思っています。もちろん、実際に取り組んでいることに関する具体的な詳細な知識が必要です。特定の領域がどのように進化するか、「流行」になるもの、または将来必要になるものを予測することは非常に難しいので、少なくとも「聞いたことがある」ものの広い領域があると、多くのドアが開きます。
私がWebプログラミングで個人的に経験した限りでは、非対称暗号の基本的な概念が見つかりました。これは、内部で何が起こっているのかを理解するのに役立ちます。私はそれなしで生き残ったかもしれませんが、私は暗号と数学を楽しんでいると言わなければなりません。