ハッシュと暗号化?ハッシュ値とは

ハッシュと暗号化

ハッシュと暗号化は同じものであるというよくある误解があります。彼らはそうではありません。ハッシュは不可逆的です。次の例を例に挙げると、

$ echo -n Password123 | md5sum
42f749ade7f9e195bf475f37a44cafcb -

文字列 "Password123" を MD5 アルゴリズム (algo) に渡し、数学的な演算を実行し、生成された 16 進数エンコードされたハッシュを返します。同じハッシュ出力値を得る唯一の方法は、algo を元の入力にすることです。衝突はありますが、後で話し合うことができます。

ほとんどのハッシュアルゴリズムの出力は、16進符号化された固定長のバイナリ文字列です。この例のような他の人は、出力として base64 でエンコードされた文字列を使用します。長さは常に同じであることに注意してください:

{SHA}uNF8eZRJ8jmr8WTjyocRJPVpe7w=
{SHA}lqdu/Zr6o2dgIER8Up1/7lcUtgw=
{SHA}qYUOwLMlDEuukA5HCT4LR1kQzco=
{SHA}MXZBCpyWJ7TTs1w2kgGJslwNwTg=
{SHA}2sAPLaUh9Mz0bI+XxKEg7qyABe8=

TL;Dr.

暗号化は可逆的で、ハッシュは


暗号化についてはあまり話したくありませんが(それらは本用なので)、ハッシュ文字列と暗号化文字列を区別できることが重要です。暗号化は通常、暗号化が発生する前に特定の長さを満たす文字列を埋めます。また、復号化するには鍵(またはパスワード)も必要です。暗号化されたパスワードを使用している場合、入力された長さに応じて文字列が変化します。長さが異なる暗号文パスワードの山が見つかった場合は、ハッシュではなく暗号化を扱っている可能性があります。AES-256-CBC 例 暗号化された文字列と関連するプレーンテキスト (キー "ASDF"):

foobar             | U2FsdGVkX19G+KtytNHdj6yH2AVvX26pEmtunS/PRnU=
foobarfoobar       | U2FsdGVkX18sPpIvN6nVh68lOUCcb3gR2fKbCCnBxog=
foobarfoobarfoobar | U2FsdGVkX1/EOnUt57TCW4Rh0EdNnWX lDatuQv2xEXXeAeowW0XG/EXJUe9aSUz

$ cat 暗号化された_パスワード
U2FsdGVkX19G KtytNHdj6yH2AVvX26pEmtunS/PRnU=
U2FsdGVkX18sPpIvN6nVh68lOUCcb3gR2fKbCCnBxog=
U2FsdGVkX1/EOnUt57TCW4Rh0EdNnWX lDatuQv2xEXXeAeowW0XG/EXJUe9aSUz

$ for i in `cat encrypted_passwords`; do echo $i | openssl enc -base64 -d -aes-256-cbc - パス パス:asdf; エコー; 完了
フーバー
フーバーフーバー
foobarfoobarfoobar 

今、あなたは考えるかもしれません: あなたは正しいかもしれません。ただし、重要なマテリアルはシステムがアクセスできる必要があります。つまり、本質的にプレーンテキストのマスターパスワードがどこかにあります。RSAキーまたはパスワードとして、またはファイル内、データベースに埋め込まれているか、アプリケーション内でハードコーディングされているか、またはメモリ内のどこかにあるパスワードです。pfft、誰も'ユーザー'パスワード

を暗号化するためのキーとしてasdfを使用しません。MD5 と同じ文字列を使用:

foobar             | 3858f62230ac3c915f300c664312c63f
foobarfoobar       | 59faa421729e846dd800dce59943bfc0
foobarfoobarfoobar | 1352aadab322d1a033c27964be0965db

ハッシュパスワードは完璧とは程遠く、実際には少し悪いですが、暗号化よりも悪いものを実現しようとしています。ユーザーはnotよりも絶対最低要件を選択する頻度が高く、複数のサイトで使用することもできます。多くの「ハック」は、実际には资格情报の再利用攻撃にすぎません。最初の妥協が暗号化を使用することであれば、攻撃者が行わなければならない唯一の努力は、すべてのパスワードを復号化する鍵を見つけることです。ハッシュの场合は 少なくとも ハッシュを解く努力が必要ですsha512crypt、bcrypt、scrypt、argon2 などの最新のアルゴリズムで使用すると、ハッシュ値を解読するのにかなりの労力が必要になる可能性があります。



マリネ

塩付けは、ハッシュする前にパスワードに文字列を追加することです。各ハッシュの塩は一意である必要があります。通常はランダムに选択されます。重要なのは、同じ平文 "password" ハッシュ値を毎回异なる値にすることです。これは、パスワードクラッカーの生活を困難にします。なぜなら、1,000人のユーザーごとに「パスワード」という単語をチェックするには、各ユーザーには固有の塩があり、ユーザー/塩ごとに1,000回作業しなければならないからです。これはまた、カスタムの 1 つの塩を必要とするため、事前にコンパイルされた辞書や rainbow テーブル (通常は...) を効果的に使用できないことを意味します。

ウェブサイトは時々これを台無しにし、すべてのユーザーのためにユニバーサルソルトを使用します。これは目的に反する。

以下は塩付き SHA1 ハッシュ値です:


b353977827f67a4ae0318f3a9447fae1c13d9d90:b8d18ca
|___________________________________________|
                  ハッシュ                  |  塩
                                        |
                                    セパレータ

このハッシュの平文は「password」である。塩値は "b8d18ca" で、SHA1 ($salt.$pass) の API を使用しています。これは、アルゴリズムが password の平文を取得し、salt を生成し、平文の前に追加することを意味します。Web サイトまたはアプリケーションがパスワードを認証しようとすると、将来的にはプレーンテキスト パスワードを入力として使用し、保存されているハッシュの salt 値を読み取り、選択したパスワードの前に追加し、生成されたハッシュ値を保存されているハッシュ値と比較します。クラッキング その一部が塩であることがわからない场合、ハッシュは次のプレーンテキストを生成します。

b8d18capassword

アルゴリズムはプレーンテキスト入力を行うため、saltと生成されたハッシュ値はユーザーに対して透明なままにすることができます。クラッキング中、アルゴリズムが塩である場合、候補のプレーンテキストを生成するときに塩を提供できるように塩を知る必要があります。適切に実施すると、塩漬けは割れに時間をかける可能性があります。ランダムな salt を使用すると、Cracker が salt の不一致なハッシュ値を解読しようと時間を無駄にするように強制されます。これは大体 device_speed / number_of_salts に必要な努力を完了します。なぜなら、候补を生成する必要があるからです。塩ごとに。塩が静的な場合、数学的演算は同じです...speed_of_device / 1.別の見方 これ:

Our GTX 980 cracks SHA1($salt.$pass) at 3576.8 MH/s or 3.5 billion candidates per second
私たちの ハッシュリスト には 1000 固有の 塩が含まれています

3,500,000,000 / 1000 = 3,500,000 candidates per second

これは 3 桁遅く、損失は 99.9% です。静的塩を使用すると、次のようになります。

Our GTX 980 cracks SHA1($salt.$pass) at 3576.8 MH/s または 3.5 billion 候补 per second
私たちの ハッシュリスト には 1 固有の 塩が含まれています
              
3,500,000,000 / 1 = 3,500,000,000 candidates per second

これが意味がない場合は、読み続けてください。後で美しいグラフがあります...


反復

単に「この平文をハッシュする」と比較して、もう 1 つの一般的な改善点は、「この平文をハッシュし、その結果をハッシュし、その結果をハッシュする」ことが何千回も繰り返されることです。これにより、単一の候補パスワードを試すときにパスワード クラッカーが何千回も実行する必要があります。これは反復、ループ、または可変コストと呼ばれます。一部のパスワード ハッシュ アルゴリズムは、ハード コーディングされた反復ラウンドを使用します。その他の Git.ハッシュ自体の一部で構成可能にします。たとえば、md5crypt() は salt を含む MD5 を使用し、ちょうど 1000 回ループします。sha512crypt() は、sha512 を使用し、塩を含み、设定可能な回数 (デフォルトは 5,000) をループします。

反復は、主にハッシュアルゴリズムの計算サイクルコストに影響を与え、そのメモリ使用量または他の要因に影響を与える。これらは、特定のタイプのハッシュタイプに対して最適化された設計の場合にも重要ですが、これはここで議論するにはあまりにも雑草です。


ハッシュタイプがクラッキング速度に与える影響

ハッシュアルゴリズムの選択の影響を示す例をいくつか見てみましょう。攻撃者が感染した Web サイトから 1,000 人のユーザーのハッシュ値を収集し、各パスワードをテストする単純な攻撃を実行したいとします。ハッシュ値 - 1 億 4,300 万パスワード候補。

感染したウェブサイトが使用するハッシュの种类は、攻撃者がこの攻撃を通過するのにかかる时间に大きな影响を与えます。これは(相対的、おおよその)グラフです 使用するハッシュの種類に応じて、攻撃を完了するのに数秒かかります。標準的なビデオカード:

まあ、それは役に立ちません!最も強いハッシュ型ははるかに遅いですが、より速いです 型は何もないまで押しつぶされています。対数 X 軸時間を使用して、同じデータ サイズをもう一度試してみましょう。バーが左から右に移動すると、バーは 10 のべき乗で増加します:

したがって、いくつかの重要なポイントは次のとおりです: いくつかのパスワード ハッシュを解読したい場合、シングル ラウンドはマルチ ラウンドよりも簡単で、塩を加えるよりも塩なしの方が簡単です。逆に、特定の企業やウェブサイトがユーザーデータを含むデータ侵害を発表した場合、a) パスワードはプレーンテキストだけでなく、ハッシュされていることが望ましい。b) それらは塩漬けであることが望ましく、ハッシュだけではありません。c) 彼らは持っていたほうがいいです 常に単一のラウンドではなく、强力なマルチラウンドの塩付きハッシュを使用しています。



ハッシュタイプを识别する

与えられたパスワードのハッシュを解読しようとする前に、それを実装するためにどのハッシュアルゴリズムが使用されているかを解読するのは、クラッカーに任せられます。ハッシュタイプの識別は通常簡単ですが、必ずしもそうではありません。クラッカーは通常、ハッシュ長やフォーマットなどの手がかりに基づいて根拠のある推測を行います。結局のところ、ハッシュタイプの推測が正しいかどうかを確信する唯一の方法は、ハッシュが割れているかどうかです。

このタスクのためのいくつかの优れたリソースはここにあり、共通のハッシュ値がどのように见えるかを示しています。

未知のハッシュの種類を識別するのに役立つ「hash-identifier」パッケージ(こちらから入手可能)は、Kali Linuxで提供されています。



冲突

冲突は、2つの异なる入力が同じハッシュ出力をもたらす场合に発生します。これは悪い(明らかに)。パスワードに関しては、実際のパスワードを解読していない可能性があることを意味するかもしれませんが、同じハッシュ値を生成する入力を見つけたので、プレーンテキスト値を使用してシステムを騙してパスワードが正当であると考えることができます。

Microsoft Office は、長年にわたって競合しやすいアルゴリズムをドキュメント保護に使用しています。単一のハッシュで複数の競合が発見されることは珍しくなく、これらの競合はすべてドキュメントのロックを解除します。

競合が発見されると、アルゴリズムは実際に破壊されます。一度起こった場合、統計的には再発する可能性が高いです。唯一私たちを妨げているのは時間と処理能力です。アルゴリズムがより堅牢になるにつれて、候補アルゴリズムを生成し、ハッシュ出力を比較してそれらを検索するには、より多くの能力と時間が必要になります。その結果、設計者は競合しにくいアルゴリズムを作成することがますます上手になってきました。


前のPowerPathHashcat パスワードクラッキングハードウェア
次のWWNhashcat とは?パスワードクラッキングの最初のステップ
  • Word/Excel/Pdf/PPT/RAR/zip/7z在线密码破解
  • offfice、PDF、压缩文件、WPS、在线密码恢复
  • hashcatonline.com在线密码破解版权所有2010-2025