独自のセキュリティスキームを作成すべきではないのはなぜですか?
カスタム暗号とカスタムセキュリティメカニズム、特にパスワードハッシュについて、この辺りに多くの質問が出ます。
そのことを念頭に置いて、私は次の特性を持つ標準的な答えを探しています。
自分でロールバックすることもできますが、セキュリティ/暗号化の専門家でない場合や、複数の専門家によってスキームを分析されている場合は、おそらく重大なセキュリティミスを犯します。私はすべての人が見て分析するために公開されているオープンソースの既知の暗号化スキームに賭けても構わないと思っています。専門家以外が社内で開発したものとは対照的に、目が多いほど、現在のバージョンに大きな脆弱性がない可能性が高くなります。
Phil Zimmermann(PGPクリエーター)から 暗号化の概要(ページ54) :
70年代前半に大学にいたとき、素晴らしい暗号化方式だと思っていたものを考案しました。単純な疑似乱数ストリームが平文ストリームに追加され、暗号文が作成されました。これは、暗号文の周波数分析を妨害するように思われ、最も機知に富んだ政府情報機関にとっても解読不可能です。私は自分の業績にとてもこだわりました。
数年後、私はいくつかの紹介暗号文とチュートリアル論文でこれと同じ方式を発見しました。いいね。他の暗号学者も同じスキームを考えていました。残念ながら、このスキームは基本的な暗号解読技術を使用して簡単に解読する方法に関する簡単な宿題として提示されました。私の華麗な計画はこれで終わりです。
この卑劣な経験から、暗号化アルゴリズムを考案すると、誤った安心感に陥りやすいことがわかりました。ほとんどの人は、機知に富んだ対戦相手による長期にわたる断固とした攻撃に耐えることができる暗号化アルゴリズムを考案するのがどれほどひどく難しいかを理解していません。
(この question には、上記の引用の詳細な説明があります。)
「自分の[暗号化/セキュリティ]を転がさない」に確信が持てない場合は、おそらくエキスパートではないため、間違いが多いでしょう。
アプリケーションは以下に対して堅牢ですか?
タイミング攻撃 。たとえば、ナノ秒まで、完全に不良なキーと部分的に不良なキーは、全体で同じ時間で失敗しますか?そうでない場合、このタイミング情報を利用して正しいキー/パスワードを見つけることができます。
トリビアブルートフォース攻撃 ;たとえば、それは数秒から数年以内に実行できます(数年以内に壊れることを心配する場合)。おそらく、セキュリティについてのあなたの考えは、1億分の1(1 000 000 000)の確率で侵入する可能性があります(ボットネットを持つ誰かが数十億回試行した場合はどうなるでしょうか)。私の考えは、1〜2のようなものを目指すことです128 (34 000 000 000 000 000 000 000 000 000 000 000)。これは、約1,000億億倍も安全で、完全に推測の範囲外です。
ユーザーアカウントへの同時攻撃;たとえば、リークされた LinkedIn ハッシュで何が起こったかのように、データベース内のすべてのパスワードハッシュで同じ(またはさらに悪いことに)「塩」でパスワードをハッシュすることができます。
特定のアカウントを簡単に攻撃します。多分単純にハッシュされた(例えばMD5/SHA1/SHA2)パスワードごとにユニークなランダムソルトがありましたが、毎秒ハッシュで数十億の可能なパスワードを試すことができるので、一般的なパスワードリスト、辞書攻撃などを使用するかもしれません。攻撃者がほんの数秒でアカウントをクラックできます。 bcryptやPBKDF2などの強力な暗号化ハッシュを使用して、適切な係数(通常は10倍)で通常のハッシュを回避またはキー強化します。(3-8))。
推測可能な/弱い「ランダムな」数への攻撃。 microtime/MT-Rand を使用するか、 のような疑似乱数をシードするために情報が少なすぎるかもしれませんDebian OpenSSLは数年前に行いました 。
保護をバイパスする攻撃。たぶん、あなたはWebアプリケーションでハッシュ/入力検証クライアントサイドを実行しましたが、これはユーザーがスクリプトを変更することで回避されました。または、クライアントが仮想マシンで実行しようとしたり、逆アセンブルしてメモリを変更したり、何らかの方法でチートしたりするローカルアプリケーションがあります。
その他の攻撃(完全なリストになることを意図していない) [〜#〜] csrf [〜#〜] 、 [〜#〜] xss [〜#〜] 、 SQLインジェクション 、ネットワーク盗聴、 リプレイ攻撃 、 中間者攻撃 、 バッファオーバーフロー など。最高の保護は非常に迅速に要約されます。
あなたはあなたの最も弱い搾取可能なリンクと同じくらい強いだけです。また、独自のスキームを導入していないからといって、スキームが安全であるという意味ではありません。導入したものを作成した人物が専門家ではなかったか、それとも弱いスキームを作成した可能性が高いです。
私の地域に家があり、2階のファミリールームの外に、本当に素敵なデッキがあります。下に行って、それがどのように構築されたかを確認するまで、それはうねりのように見えます。住宅所有者は、デッキの作り方を教えるためにビルダーや建築家に大金を払う必要はないと判断したようです。彼はそれを自分で構築し、2x4の下にある混沌とした蜘蛛の巣のように見えます。それ[〜#〜]おそらく[〜#〜]で結構です。個人的には、そのようなアマチュア建設の仕事に命をかけたり、足を踏み出したりしたくないのです。
暗号化を行うためのアルゴリズムを開発したいのであれば、暗号化を行って楽しい時間を過ごしるべきだと思います。オンラインの銀行取引明細書を非表示にするためにこれを使用することはお勧めしませんが、自宅のコンピューターでガールフレンドのラブレターを暗号化したい場合は、それは問題ありません。
「アメリカのブラックチャンバー」*には、海軍が独自の暗号を開発しているという話があります。海軍は彼ら自身に満足して彼らの新しい暗号化システムを示し、陸軍アナリストであるヤードリーは彼らが間違ったことを説明してすぐにコードを壊しました。彼らはコードを修正することを申し出ましたが、ヤードリーは、彼らが特定の弱点を修正することはできましたが、しっかりとした理解がなければ、常に問題を抱えることになると指摘しました。彼らのシステムには本質的に欠陥があった。これは、漏れやすい屋根にパッチを当てるようなものです。いつまでもパッチを適用できますが、水はまだ流れ込みます。水に濡れたくない場合は、屋根について少し知識がある人が屋根を建てる必要があります。
私は亡くなった義母に対して私が行った日曜大工の脳手術についてあなたに言ったことがありますか?彼女が行って死ぬまで、すべてがうまくいきました。真剣に、私たちのほとんどは素人の医者に自分の健康を信頼しません。あなたは本当にあなたの秘密をアマチュアソフトウェアに信頼したいですか?認めたくないのですが、数か月ごとに宝くじを購入しています。私は完全に失うことを期待していますが、潜在的な支払いは巨大です。私はオッズをプレイすることができ、多分私は先に出てくるでしょう。そうでなければ、私はお金を出しています。なぜ暗号化の確率を上げるのですか?支払いはありません。
よろしく、/ボブブライアン
Bruce Scheier 書いた 1998年に戻って:
最も無知なアマチュアから最高の暗号学者まで、誰でも彼自身が破ることができないアルゴリズムを作成できます。それも難しいことではありません。難しいのは、何年にもわたる分析を行った後でも、他の誰も破ることのできないアルゴリズムを作成することです。そして、それを証明する唯一の方法は、アルゴリズムを最高の暗号技術者による長年の分析にかけることです。
Cory Doctorowは、2004年にこの概念を「シュナイアーの法則」と名付けました speech :
誰もがセキュリティシステムを発明できるので、彼女または彼はそれを破る方法を考えることができません。
フォローアップとして、再び this 、シュナイアーから:
誰かがあなたにセキュリティシステムを渡して、「私はこれは安全だと思います」と言ったとき、あなたが最初に尋ねなければならないことは、「一体誰なんだ?」システムのセキュリティに対するあなたの主張が何かを意味していることを示すために、あなたが何を破ったのかを見せてください。
Phil Zimmermanも 元のPGP論文 :
私が70年代の初めに大学にいたとき、私は素晴らしい暗号化方式であると私が信じていたものを考案しました。単純な疑似乱数ストリームが平文ストリームに追加され、暗号文が作成されました。これは一見暗号文の周波数分析を妨害するように思われ、最も機知に富んだ政府の諜報機関にとってさえ解読できません。私は自分の業績にとてもこだわりました。そうコックシュア。
数年後、私はいくつかの紹介暗号文とチュートリアル論文でこれと同じ方式を発見しました。いいね。他の暗号学者も同じスキームを考えていました。残念ながら、このスキームは基本的な暗号解読技術を使用して簡単に解読する方法に関する簡単な宿題として提示されました。私の華麗な計画はこれで終わりです。
元の投稿は例を求めました:
Babington Plot は、問題を引き起こしている悪い暗号システムの良い物語です。スコットランドのメアリー女王は、いとこの女王エリザベス1世に投獄され、暗号化された手紙を介して外部の人々とコミュニケーションをとっていました。アルファベットは、squiggles、crossed circles、triangleのcryptoalphabetに置き換えられ、e、t、i、oなどの一般的な文字に割り当てられた追加の文字が含まれるため、周波数分析で文字の意味をすばやく見つけることができませんでした。彼らはまた、アナリストを落とすために復号化で無視されたいくつかのヌル文字を追加しました。問題は、女王がメッセージを傍受されたときにメッセージを解読することができたトーマスフェリペスの人物の非常に有能な暗号解読者を彼女のスタッフに持っていたことでした。
物事が進むにつれて、メアリーは陰謀を共にし、彼女を脱出させて王位を継承させました。女王のエージェントはメアリーからの最後の手紙を傍受する前に傍受したとき、彼らは陰謀に関与した人々の名前を尋ねる暗号化された文を追加しました。メアリーの特派員は忠実に答え、女王のエージェントは関係者全員を処刑させました。
私の子供たちが小さいとき、私は彼らに昼食と一緒に暗号文を送りました(鍵付き(バーナム暗号を使用して))。一般的に、彼らは冗談でしたが、決して重要ではありませんでした。そんな時は自分で巻いても大丈夫です。イングランドの女王(またはイランのシャー、またはミャンマーのゆっくりと改革を続けるサグス政権)を倒そうと計画している場合は、使用しているものを簡単に解読できないようにすることをお勧めします。 ブルース・シュナイアーが言ったように 、誰も解読できない暗号システムを思い付くことができますが、誰も解読できない誰かを思い付くのはより困難です。
ここで私が働いている場所で起こったことの例を挙げましょう。私の同僚は、会社のFTPアカウント用のパスワードストレージシステム(長い話、頼まないでください)の設計を担当していました。私は引き継ぐように頼まれました、そして私が最初に見たのは:
public string Encrypt(string rawText)
{
// homebrew code here
}
public string Decrypt(string encrypted)
{
// homebrew code here
}
私はすぐにそれらを取り除き、標準の暗号化ライブラリ呼び出しに置き換えました-そして私が質問されたとき、私は答えました:
「あなたnever独自の暗号化ルーチンを実行してください。」
私の同僚はこれに何時間も戦いました。彼はたくさんの時間を費やして完璧にしたので、攻撃者はおそらくそれを壊すことができませんでした。ある時点で、彼らは「これはAES256よりも安全です。それがどのように機能するか誰も知らないからです。」
その時点で、私は2つのことを知っていました。
だから私はコードを脇に置きます。代わりに、Encrypt()関数を呼び出して出力を調べるだけで、ルーチンをコード解読してみました。私は初心者です-私はクリプトアナリストではありません-しかし、それだけで4時間しかかかりませんでした。私は彼らにクラックを示し、彼らに私の手順を説明し、繰り返し言いました:自分の暗号化を決して行わないでください。うまくいけば、彼らはそれを心に留め、二度とそれをすることはないでしょう。
つまり、次のようになります。
暗号化では、期待する方法で攻撃する相手は1人ではありません。あなたは絶対にすべてのものを考えなければならないので、これは推論するのを難しくしているものです。
しかし、実際には、誰もがすべての可能な対戦相手をしのぐことができません。私たちにできる最善のことは、私たちの共通の知識と既存の研究を可能な限り利用し、そこから構築するために赤ん坊の一歩を踏み出すことです。攻撃ベクトルごとに。
これは、物理学の研究や最高レベルのチェスのプレイなど、人間の能力の瀬戸際にある多くの問題に取り組む方法です。
これらの分野では、他の人が取り組んでいることを無視して独自の戦略や理論を考案することもできます。また、最初の熟練した対戦相手に出会った場合、より多くの方法で最先端の技術に打ちのめされます。
TL; DR
人間は愚かすぎて暗号化だけを行うことはできません。
暗号システムを設計する誰かがそれが作成された会社を辞めないことを保証することは不可能であり、その設計に関する知識を元の雇用主に損害を与えるために使用することはできません。敵対者が獲得する可能性のあるそのような知識は、役に立たなくなる可能性があります。
キー以外のすべてを知っている攻撃者に対しても安全な暗号システムがあり、ランダムに生成された新しい値にキーを変更すると、システムは新しいキーを持たない攻撃者に対して安全になります。キーが変更される前に攻撃者がシステムを危険にさらすのに十分な情報を持っていたとしても、後でシステムを破壊することはできません。
システムが非常に貴重なデータを保護する必要がない限り、内部システムの知識がなければ、それを解読するコストがそうすることによって得られるあらゆる価値を超えるほど十分に優れた暗号システムを設計することはおそらくそれほど難しくありません。優れた暗号を設計するのは簡単ではありませんが、ほとんどのシステムは攻撃者にとって非常に価値のあるものを保護するために使用されていないためです(熟練した暗号技術者が58分でシステムを簡単に破ることができたとしても、それはそれほど重要ではありません)攻撃者にとってのそのような情報の価値が暗号学者の時間のコストを超えない限りリスク)。
ただし、内部データを持つ誰かに対して堅牢にすることができるようにシステムを設計することははるかに困難であり、キーを変更することによって堅牢にすることができるシステムを設計するのに十分な専門知識を持つ人はほとんどいません。設計の完全な内部知識と暗号化の専門知識の両方を持っている人。インサイダー知識のない暗号化の専門家は、設計者が犯した可能性のある数百または数千の潜在的なミスをチェックする必要があるかもしれませんが、インサイダー知識はその人物がミスを即座に特定して悪用することを可能にする場合があります。
Crypto Fails が呼び出されるので、暗号コードをまったく書くことができないと言うのは少し厳しいです。主な問題は、そのコードを取得せず、どこでも(リリースされたソフトウェアで)使用することです。
あなたは間違いなくそれを試してみて、それを学習体験として使うべきです。あなたが暗号解読者と友達で、あなたが書いたものについて彼らのフィードバックを得ることができるなら、さらに良いでしょう。彼らが彼らの塩の価値がある場合、彼らもまた、実際のコードを使用しないように指示しますが、学習と成長に役立ついくつかの情報を提供できるはずです。