パスワードを作成するにはどうすればよいですか。md5で直接(ソルトなしで)ハッシュすると、8文字の "SALT ME!"を含む文字列が返されます。自分のユーザーデータベースをブラウジングしているナイーブな開発者が「ハッシュ」を見て、彼のアプリケーションの不安定さを理解し、最終的には世界を誰にとってもより良い場所にすることを期待しています。
Md5は128ビット、つまり16バイトを出力します。 16バイトのメッセージがある場合、元のプレーンテキストのパスワードを取得することは、プレイメージに相当しますが、私の知る限り、実際には不可能です。ただし、私はハッシュで特定の8バイトのみを探しています。
そのようなパスワードを取得することは、一般的なコンピュータの日中の時間枠で実現可能ですか?もしそうなら、どうすればそのようなパスワードを計算できますか?
MD5の出力はバイナリです。128ビットのシーケンスで、通常16バイトとしてエンコードされます(技術的には16octetsですが、バイトのオクテットの一般的な規則を使用しましょう)。
人間はビットやバイトを読みません。 文字を読み取ります。文字をバイトとしてエンコードする方法、および同様にバイトを文字にデコードする方法を伝えるコードページは多数あります。ほとんどすべての場合( [〜#〜] ascii [〜#〜] のため)、低値バイト(0〜31)は「制御文字」であり、実際には文字として表現できません。したがって、実際にMD5出力を直接読み取る人はいません。誰かがハッシュ値を「読み取っている」場合、これらの値はおそらくそのためのいくつかの一般的な規則の1つを使用して文字にエンコードされます。最も一般的な2つの規則は 16進数 と Base64 です。
16進数の場合、数字と、文字 'a'から 'f'(従来はハッシュ値の場合は小文字)しかありません。 「SALT ME!」を取得できません。 16進出力で...
Base64では、エンコーディングは26のアクセントなしラテン文字(小文字と大文字の両方)、数字、および「+」と「/」記号をすべて使用します。したがって、「SaltMe」または「SALTME」を期待できます。これでthatが実行可能になりました。Base64の各文字は6ビットをエンコードするため、6文字の出力は36ビットのみに対応します。 「SaltMe」または「SALTME」を生成するパスワードの検索は、(平均して)2で行われます。35適切に最適化されたコードを使用して、数分または数時間以内に試行します。
ただし、実際にBase64でエンコードされたハッシュ値を読み取るために実際に時間を費やす人は、おそらく「社会的な問題」を抱えているため、期待どおりに反応しない可能性があることに注意してください。
そしてそれが行われます:MD5でハッシュするとき、結果をBase64エンコードします:
infjfieq
利回り:SALTMEnBrODYbFY0c/tf+Q==
lakvqagi
利回り:SaltMe+neeRdUB6h99kOFQ==
あらかじめ計算されたハッシュを持つ Rainbow table セットがあります。適切なバイト値を含むハッシュ値を検索することができます(編集:事前に生成されたフルハッシュのブルートフォーシングとプローブを行う必要があるため、実行がはるかに困難になります- bonsaivikingのコメント を参照してください答え)、そのようなものが存在する場合(0xBADBADを含むものなど)。存在する場合、Rainbowテーブル自体から、そのハッシュが導出されたプレーンテキストを取得できます(そして、そのパスワードを使用する場合、データベースを取得する誰もがそれを元に戻すことができるため、定義上、安全ではありません。推奨されません)。
このアプローチには多くの仮定があります。
しかし、主な最大の前提は、誰かが数千人、数千人、数百万人、数千人などのユーザーのデータベースを調べており、一連のハッシュから、さらにはハッシュの一部からも奇妙な値を見つけているということです。
8バイトは64ビットであり、ブルートフォースを超えています。 md5に対するプリイメージ攻撃は知らないので、おそらく運が悪いでしょう。
また、一部のWebサイトでは、SQLIに対する(無効な)対策として文字セットをエスケープまたは制限しています