パスワードをハッシュする方法としない方法

画像



繰り返しになりますが、Webプロジェクトの情報セキュリティの監査を終えたとき、私の個人的な樽は怒りのinりで一杯になり、この投稿にあふれました。



ハッシュを使用して状況を非常に簡潔かつ迅速に概説しようとします。



考慮するハッシュを適用するタスク-ユーザー認証をすぐに決定します。 パスワード回復トークンでも、認証要求でも、他のものでもありません。 これは、データチャネルの保護に関する記事でもないため、チャレンジ/レスポンスおよびSSLに関するコメントは不適切です。







マテリエル(ショート)



ハッシュ=ハッシュ関数-(畳み込み)文字列(任意の長さ)の有限セット(指定された長さの文字列)への明確なマッピングの関数。

数値(文字列)ハッシュ自体は、データのハッシュ関数を計算した結果です。

暗号化および非暗号化(チェックサムなど、個別に分類される)ハッシュ関数があります。



暗号化ハッシュには、他のすべてと区別する3つの追加条件があります。



詳細-en.wikipedia.org/wiki/%D0%A5%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8 %D0%B5



アプリケーション開発者が暗号化の複雑さを掘り下げる必要はありません;現在使用できるハッシュ関数(名前によるアルゴリズム)と使用していないハッシュ関数を覚えておけば十分です。 MD5-許可されなくなった同僚-bcrypt / scryptを使用してください。



Webアプリケーションでは、とりわけ、ハッシュ関数を使用して、データベースに秘密(パスワード)を安全に保存します。

攻撃者が認証システムのローカル攻撃に攻撃を減らすことができた場合、最後の砦になるのはハッシュ関数です。 オンライン攻撃(HTTPリクエストのパスワードの検索)については、誰か他の人が後で書くかもしれません。



以下は、データベース内のハッシュが満たす必要がある要件です。





最初の要件を満たすには、永続的なハッシュ関数を使用する必要があります(90年代ではありません!)。

2番目のものを実行するには、ハッシュする前にランダムな文字列(塩)がパスワードに追加されます。 したがって、パスワード「123456」を持つ2人のユーザーは異なる塩「salt1」と「salt2」を持つことになり、データベース内の「123456 salt1」と「123456 salt2」のハッシュ関数も異なります。



ここで、ストレージシステムについて少し説明します。ソルトとハッシュ自体の両方がデータベースに保存されます。

つまり、DBMSにアクセスすることで、攻撃者はハッシュ値とソルト値も受け取ります。



ローカルパラメータを使用してください!



ブルートフォースの攻撃中に生活を複雑にするために、パスワードに塩を追加する必要があります(その逆ではありません)(もちろん左から右に書く人のために)。

ハッシュ関数は、原則として1行で順番に計算されるため(アルゴリズムスレッド要件)、サブキャッシュ式がsaltで始まる場合、攻撃者は「salty」ハッシュを列挙しやすくなります。

彼(攻撃者)は事前にハッシュ(塩)を事前に計算してから、ハッシュ(塩)+ハッシュ(パスワード)をすでにはるかに高速(ハッシュ(パスワード)とほぼ同じ速度)で検討できるため、簡単です。 繰り返されるすべてのパスワードについて。



攻撃者の生活をさらに複雑にするために、Solar Designer www.openwall.com/presentations/YaC2012-Password-Hashing-At-Scale/mgp00005.htmlは、ローカルパラメーターと呼ばれるものをもう1つ導入することを提案しています。



これは基本的に、すべての(パスワード+ salt)構造に追加される「2番目のソルト」であり、データベース内のすべてのハッシュで同じです。 トリックは何ですか? データベースにローカルパラメータがないという事実。 これは、アプリケーションメモリに格納されるシステム定数であり、構成から取得されます(何らかの方法で、データベースからではありません)。



1つのハッシュストアからのデータを使用するブルートフォース攻撃をほぼ完全に排除する非常にシンプルで効果的な手段(ローカルパラメーターを知らない)。



私たち(ONsec)がローカルパラメーターでハッシュを壊したのは、ローカルパラメーター自体を攻撃するための戦術を開発している間だけです(アプリケーションに登録し、データベースでハッシュ、ソルト(パスワードを既に知っている)を探し、LPを反復処理します)。 そして無駄に。 最新のハッシュ関数では16バイト以上-これはハードウェアにとって非常に高価です。 その結果、認証システムを侵害するのが簡単であることが判明しました(UPDATEを介してデータベースに自分の役割=管理者を入れてください)。



プレゼンテーションを読むことを強くお勧めします: www.openwall.com/presentations/YaC2012-Password-Hashing-At-Scale/mgp00001.html



ボールトを確実かつ適切に保護してください!



おわりに


私は現実的です-当然、「一部の」ハッシュのために誰もプロジェクトを書き換えません。 ただし、新しいプロジェクトはscrypt / bcryptで作成できます。 また、-弱いMD5でもローカルパラメータを実装します-検証済みです。



人件費に加えて、異なるタイプのハッシュに切り替えると、生産性の問題がしばしば発生します。 実際、より堅牢なアルゴリズムはより多くのリソースを消費します。 1秒あたりのユーザー認証の速度をワークロードに実装する前にテストします(ほとんどの大規模なプロジェクトでは、scryptへの切り替えは簡単でした)。 特定の状況で特定の理想的なハッシュタイプを選択することは、大きく異なります。 そのため、たとえば、RBSは、所定の速度でハッシュを生成するための鉄ソリューションをますます選択しています。



結論として、1000ドル未満のAMD Radeon 7990カードで受信したハッシュのソート速度(測定単位は1秒あたりのメガハッシュ、つまり数)を示します(古いレートでも)。







また、bcrypt brute forceの有効性については、 www.openwall.com / presentations / Passwords13-Energy-Efficient-Cracking / Passwords13-Energy-Efficient-Cracking.pdfも確認することをお勧めします。



All Articles