ハッシュアルゴリズムと暗号化アルゴリズムの基本的な違い


509

ハッシュと暗号化アルゴリズムの間に多くの混乱が見られます。次のことについて、より専門的なアドバイスを聞きたいです。

  1. ハッシュと暗号化を使用する場合

  2. ハッシュまたは暗号化アルゴリズムを(理論的/数学的なレベルから)異なるもの、つまりハッシュを不可逆にするもの(レインボーツリーの助けなし)

以下は、私が探していたほど詳細に説明しなかったいくつかの同様の SO質問です。

難読化、ハッシュ、暗号化の違いは何ですか?
暗号化とハッシュの違い


28
私はこれが人々が用語を混同するときに人々を参照する質問であることを予測することができます。:)
Adam Paynter

18
ハッシュは一方向(元に戻すことはできません)、暗号化は双方向(復号化可能)です
bestsss

ハッシュは、ファイルなどの大きな構造やオブジェクトのインデックス作成にも役立ちます。ハッシュテーブルを参照してください。
HABO 2013年

22
ハッシュは肉挽き器のようなものです。牛をハンバーガーにすることはできますが、その逆はできません。
Neil McGuigan

質問が編集されていることに気付きました。私は常にこの2つのレベルの最上位レベルの違いを知っていましたが、低レベル/数学的な違いにもっと興味を持っていました。:)いずれにせよ、SOにはたくさんの良いコンテンツがあります。どうもありがとう!
ケニーケイソン2015年

回答:


738

まあ、あなたはウィキペディアでそれを調べることができます...しかし、説明が欲しいので、私はここで最善を尽くします:

ハッシュ関数

これらは、任意の長さの入力と(通常)固定長(またはより短い長さ)の出力との間のマッピングを提供します。単純なcrc32から、MD5やSHA1 / 2/256/512などの本格的な暗号化ハッシュ関数まで、何でもかまいません。重要なのは、一方向のマッピングが行われていることです。すべての関数は入力可能な出力よりも小さい出力を生成するため、それは常にmany:1マッピングです(つまり、常に衝突が発生します)(可能なすべての1mbファイルをMD5にフィードすると、大量の衝突が発生します)。

それらを元に戻すのが難しい(または実際には不可能)理由は、内部での動作方法にあります。ほとんどの暗号化ハッシュ関数は、入力セットを何度も繰り返して出力を生成します。したがって、入力の固定長の各チャンク(アルゴリズムに依存)を見ると、ハッシュ関数はそれを現在の状態と呼びます。その後、状態を反復処理して新しい状態に変更し、それをフィードバックとして使用します(MD5は、これを512ビットのデータチャンクごとに64回実行します)。次に、これらのすべての反復の結果の状態を何らかの形で組み合わせて、結果のハッシュを形成します。

ここで、ハッシュをデコードする場合は、最初に、与えられたハッシュをその反復状態に分割する方法を理解する必要があります(データのチャンクのサイズよりも小さい入力の可能性、より大きな入力の場合は多くの場合)。次に、各状態の反復を逆にする必要があります。さて、これは非常に困難である理由、推測しようと想像を説明するab以下の式:10 = a + b。の10の正の組み合わせがaあり、bそれは機能します。今度はそのループを何度もループします。tmp = a + b; a = b; b = tmp。64回の反復の場合、10 ^ 64を超える可能性があります。そして、これは、いくつかの状態が反復ごとに保存される単純な追加です。実際のハッシュ関数は、1つ以上の操作を実行します(MD5は4つの状態変数で約15の操作を実行します)。また、次の反復は前の状態に依存し、現在の状態を作成するときに前の状態が破棄されるため、特定の出力状態につながる入力状態を特定することはほぼ不可能です(反復ごとに)。それを組み合わせると、多数の可能性が伴うため、MD5をデコードする場合でも、ほぼ無限(ただし無限ではない)のリソースが必要になります。リソースが多すぎて

暗号化機能

それらは、任意の長さの入力と出力の間の1:1マッピングを提供します。そして、それらは常にリバーシブルです。注意すべき重要なことは、それが何らかの方法を使用して可逆的であるということです。そして、それは与えられたキーに対して常に1:1です。これで、同じ出力を生成する可能性のある複数のinput:keyペアがあります(実際には通常、暗号化機能に応じて存在します)。優れた暗号化データは、ランダムノイズと区別がつきません。これは、常に一貫した形式の優れたハッシュ出力とは異なります。

ユースケース

値を比較したいが、プレーンな表現を保存できない場合(さまざまな理由で)は、ハッシュ関数を使用します。セキュリティ上の理由からプレーンテキストを保存したくないので(そうすべきではないので)、パスワードはこのユースケースに非常によく適合します。しかし、海賊版音楽ファイルのファイルシステムをチェックしたい場合はどうでしょうか?音楽ファイルごとに3 MBを保存するのは現実的ではありません。そのため、代わりに、ファイルのハッシュを取得して格納します(md5は3MBではなく16バイトを格納します)。そうすれば、各ファイルをハッシュして、格納されているハッシュのデータベースと比較するだけです(再エンコード、ファイルヘッダーの変更などのため、実際にはうまくいきませんが、これは使用例です)。

入力データの妥当性をチェックする場合は、ハッシュ関数を使用してください。それは彼らが設計されたものです。入力が2つあり、それらが同じであるかどうかを確認する場合は、両方をハッシュ関数で実行します。入力サイズが小さい場合、衝突の確率は天文学的に低くなります(適切なハッシュ関数を想定)。これがパスワードに推奨される理由です。32文字までのパスワードの場合、md5には4倍の出力スペースがあります。SHA1には、約6倍の出力スペースがあります。SHA512の出力スペースは約16倍です。パスワード何であるかは特に気にせず、保存されているパスワードと同じであるかどうかを気にします。そのため、パスワードにはハッシュを使用する必要があります。

入力データを元に戻す必要があるときはいつでも暗号化を使用してください。「必要」という単語に注意してください。クレジットカード番号を保存している場合は、いつか元に戻す必要がありますが、プレーンテキストは保存したくありません。代わりに、暗号化されたバージョンを保存し、キーをできるだけ安全に保管してください。

ハッシュ関数は、データの署名にも最適です。たとえば、HMACを使用している場合、既知の送信されていない値(シークレット値)と連結されたデータのハッシュを取得して、データの一部に署名します。したがって、プレーンテキストとHMACハッシュを送信します。次に、受信者は送信されたデータを既知の値でハッシュし、送信されたHMACと一致するかどうかを確認します。同じであれば、秘密の価値のない当事者によって改ざんされていないことがわかります。これは一般に、HTTPフレームワークによる安全なCookieシステム、およびデータの整合性をある程度保証したいHTTPを介したデータのメッセージ送信で使用されます。

パスワードのハッシュに関する注意:

暗号化ハッシュ関数の重要な機能は、作成が非常に速く、逆にするのが非常に困難/遅いことです(そのため、実際には不可能です)。これはパスワードに問題を引き起こします。を保存するとsha512(password)、レインボーテーブルやブルートフォース攻撃に対する防御策を講じていないことになります。覚えておいてください、ハッシュ関数はスピードのために設計されました。したがって、攻撃者がハッシュ関数を使用して辞書を実行し、各結果をテストするのは簡単です。

ハッシュに未知のデータを少し追加するため、ソルトを追加すると問題が解決します。したがって、に一致するものを見つける代わりmd5(foo)に、既知のソルトに追加したときに生成されるものを見つける必要がありますmd5(foo.salt)(これは非常に困難です)。しかし、それでも速度の問題は解決しません。なぜなら、もし彼らがソルトを知っていれば、それはただ辞書を実行することの問題だからです。

したがって、これに対処する方法があります。一般的な方法の1つは、キー強化(またはキーストレッチ)と呼ばれます。基本的に、ハッシュを何度も繰り返します(通常は数千回)。これは2つのことを行います。まず、ハッシュアルゴリズムの実行速度が大幅に低下します。次に、正しく実装されている場合(各反復で入力とソルトを渡す)、出力のエントロピー(利用可能なスペース)が実際に増加し、衝突の可能性が減少します。簡単な実装は次のとおりです。

var hash = password + salt;
for (var i = 0; i < 5000; i++) {
    hash = sha512(hash + password + salt);
}

以下のような他の、より標準的な実装がありPBKDF2bcryptのは。しかし、この手法は、かなりの数のセキュリティ関連システム(PGP、WPA、Apache、OpenSSLなど)で使用されています。

一番下の行は、hash(password)十分ではありません。 hash(password + salt)優れていますが、それでも十分ではありません...ストレッチハッシュメカニズムを使用してパスワードハッシュを生成します...

ささいなストレッチに関する別の注意

1つのハッシュの出力をハッシュ関数に直接フィードバックしないでください

hash = sha512(password + salt); 
for (i = 0; i < 1000; i++) {
    hash = sha512(hash); // <-- Do NOT do this!
}

この理由は、衝突に関係しています。可能な出力スペース(可能な出力の数)は入力スペースよりも小さいため、すべてのハッシュ関数には衝突があることに注意してください。理由を確認するために、何が起こるかを見てみましょう。これを始めるために、衝突の可能性が0.001%あると仮定しましょうsha1()(実際にははるかに低いですが、デモ目的のためです)。

hash1 = sha1(password + salt);

現在、hash1衝突の確率は0.001%です。ただし、次を実行するとhash2 = sha1(hash1);、のすべての衝突はhash1自動的にの衝突になりhash2ます。これで、hash1のレートは0.001%になり、2回目のsha1()呼び出しで追加されます。したがって、現在、hash2衝突の確率は0.002%です。それは2倍のチャンスです!各反復は0.001%、結果に別の衝突の機会を追加します。したがって、1000回の反復で、衝突の可能性はわずかな0.001%から1%に跳ね上がりました。これで、劣化は線形になり、実際の確率ははるかに小さくなりますが、効果は同じです(との単一の衝突の可能性の推定は、md5約1 /(2 128)または1 /(3x10 38)。それは小さいように見えますが、誕生日の攻撃のおかげで実際にはそれほど小さくはありません)。

代わりに、ソルトとパスワードを毎回追加することで、データをハッシュ関数に再導入します。したがって、特定のラウンドの衝突は、次のラウンドの衝突ではなくなります。そう:

hash = sha512(password + salt);
for (i = 0; i < 1000; i++) {
    hash = sha512(hash + password + salt);
}

ネイティブsha512関数と同じ衝突の可能性があります。あなたが望むのはそれです。代わりにそれを使用してください。


30
彼らは無塩SHA1ハッシュとしてパスワードを保存する前に、あまりにも悪いのLinkedInのプログラマーがこれを読んでいない... money.cnn.com/2012/06/06/technology/linkedin-password-hack/...
エリック・J.

2
@Pacerier:ハッシュにも少し重点を置いています。具体的にはパスワードハッシュについて詳しく説明しています...
ircmaxell

1
同じ出力をもたらす複数のキーが存在する可能性がある場合、1対1のマッピングになる可能性があることを理解できません。DESの場合、キーの長さは56ビットで、ブロックサイズは64ビットです。したがって、同じ出力ブロックにマップできる256の異なるキーはありませんか?
mrQWERTY 2015

1
@ Renren29はい。あなたは正しいです。実際には、暗号全体は全射的でも単射的でもありません。ただし、指定された鍵の場合、それは全射型です(各プレーンテキストには正確に1つの暗号文があります)。これが、指定されたキーに対して常に1:1であると私が言っ理由です。同じ出力ブロックに出力できるキーが複数なかった場合、暗号文はキーについて(知らないうちに)何かを教えてくれるので、暗号は役に立ちません。
ircmaxell 2015

7
すばらしい答えです。私の唯一のヒントは、些細なストレッチの低下が線形にできないか、最終的に100%に達することです。.001%の例では、2番目のステップは.001 +(1-0.001)* .001、または0.001999になるはずです。
AlexDev 2015年

160

ハッシュ関数は、パンを焼くのと同じであると考えることができます。入力(小麦粉、水、酵母など)から始め、ハッシュ関数(混合+ベーキング)を適用した後、出力(パンの塊)で終わります。

逆方向に進むのは非常に困難です-パンを小麦粉、水、酵母に実際に分離することはできません-ベーキングプロセス中に失われたものの一部であり、使用された水、小麦粉、または酵母の量を正確に知ることはできません特定のパン。その情報はハッシュ関数(別名オーブン)によって破壊されたためです。

入力の多くの異なるバリアントは、理論的には同一のパンを生成します(たとえば、2カップの水と1 tsbpの酵母は、2.1カップの水と0.9tsbpの酵母とまったく同じパンを生成します)。入力の組み合わせが正確にそれを生み出した。

一方、暗号化は金庫ボックスと見なすことができます。最初にロックされていたキーを持っている限り、何を入れても戻ってきます。これは対称操作です。キーといくつかの入力が与えられると、特定の出力が得られます。その出力と同じキーを指定すると、元の入力に戻ります。1:1のマッピングです。


2
特定のハンバーガーが完全に特定の牛からのものであることを簡単に示すことができないことを除いて、ハッシュの基本的な特性であるので、それは面白いアイデアですが恐ろしい類推です。
user467257 2016年

1
@caf lol確かにそれと古典。ただし、牛が市場に出ることはほとんどありません。牛は牛乳です。ブル:肉。
Funk Forty Niner、

1
それの背後にあるこの話はとても美味しく聞こえます。
シチルジュ2017

44

元の入力に戻したくない場合はハッシュを使用し、そうした場合は暗号化を使用します。

ハッシュはいくつかの入力を受け取り、それをいくつかのビットに変換します(通常、32ビット整数、64ビット整数などの数値と見なされます)。同じ入力は常に同じハッシュを生成しますが、プロセスで主に情報を失うため、元の入力を確実に再現することはできません(ただし、いくつかの注意点があります)。

暗号化は、主に暗号化関数に入力したすべての情報を保持しますが、特定のキーを所有せずに元の入力に戻すことが困難(理想的には不可能)になるだけです。

ハッシュの簡単な例

ハッシュが(一般的なケースで)元の入力に戻せない理由を理解するのに役立つ簡単な例を次に示します。1ビットのハッシュを作成しているとしましょう。私のハッシュ関数はビット文字列を入力として受け取り、入力文字列に設定されたビット数が偶数の場合はハッシュを1に設定し、奇数の場合は0に設定します。

例:

Input    Hash
0010     0
0011     1
0110     1
1000     0

ハッシュが0になる入力値とハッシュが1になる入力値が多数あることに注意してください。ハッシュが0であることがわかっている場合、元の入力が何であったかを確実に知ることはできません。

ちなみに、この1ビットハッシュは正確に考案されたものではありません... パリティビットを確認してください。

暗号化の簡単な例

単純な文字置換を使用してテキストを暗号化する場合があります。たとえば、入力がAの場合はBを書き込みます。入力がBの場合はCを書き込みます。入力がZの場合は、アルファベットの最後までずっともう一度Aを書きます。

Input   Encrypted
CAT     DBU
ZOO     APP

単純なハッシュの例と同様に、このタイプの暗号化は歴史的に使用されきました


「暗号化」は口語的に強い暗号化を指し、上記の例のCaesar暗号などの弱い暗号化と混同しないでください。
FAX

@Faxはい、しかし強力な暗号化を構成するものは、古くから動いているバーです。ドイツの第二次世界大戦エニグママシンを解読することはほぼ不可能でした(それについての素晴らしい映画があります)。今日、あなたのスマートウォッチはそれを簡単に割れる可能性があります。DESはかつてMD5と同様に強力であると考えられていました。今日の強力な暗号化は、やがて量子コンピューティング技術の餌食になる恐れがあります。
エリックJ.

確かに、そして暗号化についてのアドバイスを提供する投稿や記事の日付をチェックすることは常に良い考えです。そうは言っても、2011
Fax

39

ハッシュと暗号化/復号化技術の基本的な概要は次のとおりです。

ハッシュ:

あなたがいる場合ハッシュ任意のプレーンテキストをもう一度、あなたはハッシュ化されたテキストから同じプレーンテキストを取得することはできません。簡単に言うと、これは一方向のプロセスです。

ハッシング


暗号化と復号化:

キーを使用してプレーンテキストを再度暗号化する場合は、同じ(対称)/差分(asymentric)キーを使用して暗号化されたテキストを復号化することにより、同じプレーンテキストを取得できます。

暗号化と復号化


更新: 編集された質問で言及されたポイントに対処するため。

1.ハッシュと暗号化を使用する場合

ハッシュは、誰かにファイルを送りたい場合に役立ちます。しかし、他の誰かがファイルを傍受して変更するのではないかと恐れています。したがって、受信者が正しいファイルであることを確認する方法は、ハッシュ値を公開することです。これにより、受信者は受信したファイルのハッシュ値を計算し、ハッシュ値と一致することを確認できます。

誰かに送信するメッセージがあると言うなら、暗号化は良いことです。キーを使用してメッセージを暗号化し、受信者が同じ(または場合によっては異なる)キーを使用して復号化して、元のメッセージを取得します。 クレジット


2.ハッシュまたは暗号化アルゴリズムを(理論的/数学的なレベルから)異なるもの、つまりハッシュを不可逆的にするもの(レインボーツリーを使用しない場合)

基本的にハッシュは、情報を失うが暗号化はしない操作です簡単に理解できるように、単純な数学的方法の違いを見てみましょう。もちろん、どちらも繰り返しが含まれる、はるかに複雑な数学的演算があります。

暗号化/復号化(リバーシブル):

追加

4 + 3 = 7  

これは、合計を取り、加数の1つを差し引くことで元に戻すことができます

7 - 3 = 4     

乗算

4 * 5 = 20  

これは、積を取り、要素の1つで除算することで元に戻すことができます

20 / 4 = 5    

したがって、ここでは、addends / factorsの1つが暗号化解除キーであり、result(7,20)が暗号化されたテキストであると想定できます。


ハッシュ(不可逆):

モジュロ除算

22 % 7 = 1   

除数を再構成するために商と被除数に対して実行できる演算がないため(またはその逆)、これを元に戻すことはできません。

「?」の場所を埋める操作を見つけることができますか?ですか?

1  ?  7 = 22  
1  ?  22 = 7

したがって、ハッシュ関数はモジュロ除算と同じ数学的品質を持ち、情報を失います。

クレジット


26

私の1つのライナー...一般的にインタビュアーは以下の答えを求めていました。

ハッシュは1つの方法です。ハッシュコードからデータ/文字列を変換することはできません。

暗号化は2つの方法で行われます。鍵を持っている場合は、暗号化された文字列を再度復号化できます。


おい!それは2行です。
Mark Storer

17

ハッシュ関数は、固定サイズのテキストにテキストの可変サイズの量を回します。

ハッシュ

出典:https : //en.wikipedia.org/wiki/Hash_function


PHPのハッシュ関数

ハッシュは、文字列をハッシュされた文字列に変換します。下記参照。

ハッシュ:

$str = 'My age is 29';
$hash = hash('sha1', $str);
echo $hash; // OUTPUT: 4d675d9fbefc74a38c89e005f9d776c75d92623e

パスワードは通常、読み取り可能なテキストとしてではなく、ハッシュ表現で格納されます。エンドユーザーがパスワードで保護されたアプリケーションにアクセスしたい場合、認証中にパスワードを入力する必要があります。ユーザーが自分のパスワードを送信すると、有効な認証システムがパスワードを受け取り、この指定されたパスワードをハッシュします。このパスワードハッシュは、システムが認識しているハッシュと比較されます。等しい場合はアクセスが許可されます。

デハッシュ:

SHA1は一方向のハッシュです。つまり、ハッシュをデハッシュすることはできません。

ただし、ハッシュを総当たりにすることはできます。https://hashkiller.co.uk/sha1-decrypter.aspxを参照してください

MD5は別のハッシュです。MD5デハッシャーは、次のWebサイトで見つけることができます:https ://www.md5online.org/ 。

ハッシュに対するブルートフォース攻撃を阻止するために、塩を与えることができます。PHPではpassword_hash()、パスワードハッシュの作成に使用できます。この関数はpassword_hash()自動的にソルトを作成します。パスワードハッシュ(ソルトを使用)でパスワードを確認するには、を使用しますpassword_verify()

// Invoke this little script 3 times, and it will give you everytime a new hash
$password = '1234';  
$hash = password_hash($password, PASSWORD_DEFAULT);  

echo $hash; 
// OUTPUT 

$2y$10$ADxKiJW/Jn2DZNwpigWZ1ePwQ4il7V0ZB4iPeKj11n.iaDtLrC8bu 

$2y$10$H8jRnHDOMsHFMEZdT4Mk4uI4DCW7/YRKjfdcmV3MiA/WdzEvou71u 

$2y$10$qhyfIT25jpR63vCGvRbEoewACQZXQJ5glttlb01DmR4ota4L25jaW

1つのパスワードを複数のハッシュで表すことができます。を使用して異なるパスワードハッシュでパスワードを確認すると、そのパスワードpassword_verify()は有効なパスワードとして受け入れられます。

$password = '1234';  

$hash = '$2y$10$ADxKiJW/Jn2DZNwpigWZ1ePwQ4il7V0ZB4iPeKj11n.iaDtLrC8bu';  
var_dump( password_verify($password, $hash) );  

$hash = '$2y$10$H8jRnHDOMsHFMEZdT4Mk4uI4DCW7/YRKjfdcmV3MiA/WdzEvou71u';  
var_dump( password_verify($password, $hash) );  

$hash = '$2y$10$qhyfIT25jpR63vCGvRbEoewACQZXQJ5glttlb01DmR4ota4L25jaW';  
var_dump( password_verify($password, $hash) );

// OUTPUT 

boolean true 

boolean true 

boolean true




暗号化機能は、 暗号化キー、およびその逆を使用して無意味な暗号文にテキストを変換します。 ここに画像の説明を入力してください

出典:https : //en.wikipedia.org/wiki/Encryption


PHPでの暗号化

暗号化を処理するPHPコードについて詳しく見ていきましょう。

--- Mcrypt拡張---

暗号化:

$cipher = MCRYPT_RIJNDAEL_128;
$key = 'A_KEY';
$data = 'My age is 29';
$mode = MCRYPT_MODE_ECB;

$encryptedData = mcrypt_encrypt($cipher, $key , $data , $mode);
var_dump($encryptedData);

//OUTPUT:
string '„Ùòyªq³¿ì¼üÀpå' (length=16)

暗号化解除:

$decryptedData = mcrypt_decrypt($cipher, $key , $encryptedData, $mode);
$decryptedData = rtrim($decryptedData, "\0\4"); // Remove the nulls and EOTs at the END
var_dump($decryptedData);

//OUTPUT:
string 'My age is 29' (length=12)

--- OpenSSL拡張---

Mcrypt拡張は7.1で廃止されました。php 7.2で削除されました。OpenSSL拡張は、php 7で使用する必要があります。以下のコードスニペットを参照してください。

$key = 'A_KEY';
$data = 'My age is 29';

// ENCRYPT
$encryptedData = openssl_encrypt($data , 'AES-128-CBC', $key, 0, 'IV_init_vector01');
var_dump($encryptedData);

// DECRYPT    
$decryptedData = openssl_decrypt($encryptedData, 'AES-128-CBC', $key, 0, 'IV_init_vector01');
var_dump($decryptedData);

//OUTPUT
string '4RJ8+18YkEd7Xk+tAMLz5Q==' (length=24)
string 'My age is 29' (length=12)

PHP mcryptは現在非推奨であり(私はそれに何か関係があったかもしれません)、SHA-1、MD5、およびECBはすべて安全ではないと見なされていることに注意してください。AES / Rijndael-128キーでA_KEYはありません。それはパスワードであり、同盟国ではありません。
Maarten Bodewes

@MaartenBodewesはい、そうです。OpenSSLは今流行りです。php.net/manual/en/book.openssl.php
Julian

10

対称暗号化:

対称暗号化は、共有鍵暗号化または共有秘密暗号化とも呼ばれます。対称暗号化では、トラフィックの暗号化と復号化の両方に単一のキーが使用されます。

ここに画像の説明を入力してください

非対称暗号化:

非対称暗号化は、公開キー暗号化とも呼ばれます。非対称暗号化は、主に2つのキーが使用されるという点で対称暗号化と異なります。1つは暗号化用で、もう1つは復号化用です。最も一般的な非対称暗号化アルゴリズムはRSAです。

対称暗号化と比較して、非対称暗号化は高い計算負荷を課し、はるかに遅くなる傾向があります。したがって、ペイロードデータの保護には通常使用されません。代わりに、その主な長所は、セキュリティで保護されていないメディア(インターネットなど)を介してセキュリティで保護されたチャネルを確立できることです。これは、データの暗号化にのみ使用できる公開鍵の交換によって実現されます。共有されることのない補完的な秘密鍵は、復号化に使用されます。

ここに画像の説明を入力してください

ハッシュ:

最後に、ハッシュは、暗号化とは異なる暗号セキュリティの形式です。暗号化は最初にメッセージを暗号化してから復号化するために使用される2ステップのプロセスですが、ハッシュはメッセージを不可逆の固定長値、つまりハッシュに圧縮します。ネットワーキングで見られる最も一般的なハッシュアルゴリズムの2つは、MD5およびSHA-1です。

ここに画像の説明を入力してください

詳細はこちら:http : //packetlife.net/blog/2010/nov/23/symmetric-asymmetric-encryption-hashing/


申し訳ありませんが、私はセキュリティの初心者ですが、「ペイロードデータを保護するために一般的に採用されている」という意味を詳しく説明していただけますか。
Abdul

2
@Abdul非対称暗号化は計算負荷が高いため、ネットワークを介してパケット(ペイロード)として送信されるデータの保護には使用されません。代わりに、公開鍵の交換を使用して安全なネットワーク接続を確立し、データを保護するために使用されます。
ラッキー

5
  1. 一方向に進む必要がある場合は、ハッシュを使用します。たとえば、システムのパスワードの場合、ハッシュを使用するのは、ハッシュ後にユーザーが入力した値がリポジトリの値と一致することだけを確認するためです。暗号化では、2つの方法があります。

  2. ハッシュアルゴリズムと暗号化アルゴリズムは、単なる数学的アルゴリズムです。したがって、その点では違いはありません。すべてが数式です。ただし、セマンティクスに関しては、ハッシュ(一方向)と暗号化(双方向)には非常に大きな違いがあります。なぜハッシュは元に戻せないのですか?それらがそのように設計されているため、一方向の操作が必要な場合があります。


4

暗号化アルゴリズムとハッシュアルゴリズムは、同様の方法で機能します。いずれの場合も、ビット間の混乱と拡散を引き起こす必要があります。要約すると、混乱によって鍵と暗号文の間に複雑な関係が生じ、拡散によって各ビットの情報が拡散されます。

多くのハッシュ関数は、実際に暗号化アルゴリズム(または暗号化アルゴリズムのプリミティブを使用します。たとえば、SHA-3候補のSkeinは、Threefishを基本的な方法として使用して各ブロックを処理します。違いは、暗号文の各ブロックを保持する代わりに、破壊的であることです。確定的にマージされて固定長になります


4

データ送信のセキュリティ、つまり双方向通信では暗号化を使用します。すべての暗号化にはキーが必要です

認可に関してはハッシュを使用します。ハッシュにはキーがありません

ハッシュは任意の量のデータ(バイナリまたはテキスト)を取り、データのチェックサムを表す一定長のハッシュを作成します。たとえば、ハッシュは16バイトです。異なるハッシュアルゴリズムは、異なるサイズのハッシュを生成します。明らかにハッシュから元のデータを再作成することはできませんが、データを再度ハッシュして、同じハッシュ値が生成されるかどうかを確認できます。一方向のUnixベースのパスワードはこのように機能します。パスワードはハッシュ値として保存され、システムにログオンするために、入力したパスワードがハッシュされ、ハッシュ値が実際のパスワードのハッシュと比較されます。一致する場合は、正しいパスワードを入力した必要があります

ハッシュが不可逆的である理由:

入力とハッシュのマッピングが1対1ではないため、ハッシュを元に戻すことはできません。 2つの入力を同じハッシュ値にマップすることは、通常「ハッシュコリジョン」と呼ばれます。セキュリティ上の理由から、「良い」ハッシュ関数の特性の1つは、実際の使用では衝突がまれであることです。


1
「入力とハッシュのマッピングが1対1ではないため、ハッシュを元に戻すことはできません」おかげで、暗号化とハッシュを区別する場合、これは非常に重要な要素だと思います。:)
ケニー・ケイソン

これは、通常のハッシュ関数、暗号化ハッシュ関数、およびパスワードハッシュを明確に区別しません。それらはすべて異なるプロパティを持っています。
Maarten Bodewes

-2

暗号化は数値と文字列を扱います。基本的に、宇宙全体のすべてのデジタル物は数字です。私が数字を言うとき、その0と1です。あなたはそれらが何であるかを知っています、バイナリ。画面に表示される画像、イヤホンで聞く音楽、すべてがバイナリです。しかし、私たちの耳と目はバイナリを理解しませんか?それを理解できるのは脳だけであり、たとえバイナリを理解できても、バイナリを楽しむことはできません。そのため、バイナリをmp3、jpgなどの人間が理解できる形式に変換します。プロセスをエンコーディングと呼びましょう。これは双方向プロセスであり、簡単にデコードして元の形式に戻すことができます。

ハッシュ

ハッシュは、別の暗号化手法であり、いったん他の形式に変換されたデータは復元できません。素人の用語では、と呼ばれる何も処理はありませんデハッシュが。sha-512、md5など、多くのハッシュ関数がその仕事をします。

元の値を復元できない場合、これをどこで使用しますか?パスワード!モバイルまたはPCのパスワードを設定すると、パスワードのハッシュが作成され、安全な場所に保管されます。次回ログインを試みるとき、入力された文字列は同じアルゴリズム(ハッシュ関数)で再びハッシュされ、出力は保存された値と照合されます。同じ場合は、ログインします。それ以外の場合は、スローされます。

クレジット:wikimediaパスワードにハッシュを適用することで、保存されたパスワードファイルを盗んだとしても、攻撃者がパスワードを取得することはありません。攻撃者はパスワードのハッシュを入手します。彼はおそらく最も一般的に使用されるパスワードのリストを見つけて、それぞれにsha-512を適用し、それを彼の手の値と比較することができます。辞書攻撃と呼ばれています。しかし、彼はこれをどのくらいの期間行うでしょうか?パスワードが十分にランダムである場合、このクラック方法が機能すると思いますか?Facebook、Google、Amazonのデータベースにあるすべてのパスワードはハッシュ化されているか、少なくともハッシュ化されているはずです。

次に暗号化があります

暗号化は、ハッシュとエンコードの間にあります。エンコーディングは双方向のプロセスであり、セキュリティを提供するために使用しないでください。暗号化も双方向のプロセスですが、暗号化キーがわかっている場合にのみ、元のデータを取得できます。暗号化の仕組みがわからなくても心配はいりません。ここでは基本について説明します。SSLの基本を理解するにはこれで十分です。したがって、暗号化には、対称暗号化と非対称暗号化という2つのタイプがあります。

対称鍵暗号化

できる限りシンプルにするようにしています。それでは、シフトアルゴリズムによる対称暗号化について理解しましょう。このアルゴリズムは、文字を左または右にシフトしてアルファベットを暗号化するために使用されます。文字列CRYPTOを取り、数値+3を考えてみましょう。次に、CRYPTOの暗号化形式はFUBSWRになります。つまり、各文字が3桁右に移動します。ここで、ワードCRYPTOが呼び出される平文、出力FUBSWRが呼び出される暗号文と呼ばれる値+3 暗号 (対称鍵)と全体のプロセスであり、暗号が。これは最も古く、基本的な対称鍵暗号化アルゴリズムの1つであり、その最初の使用法はJulius Caesarの時代に報告されました。それで、それは彼にちなんで名付けられ、それは有名なシーザー暗号です。暗号化キーを知っていて、Caesarのアルゴリズムの逆を適用して元の平文を取得できる人。したがって、これは対称暗号化と呼ばれます。

非対称鍵暗号化

対称暗号化では、暗号化と復号化の両方に同じキーが使用されることがわかっています。そのキーが盗まれると、すべてのデータが失われます。これは大きなリスクであり、より複雑な手法が必要です。1976年にWhitfield DiffieとMartin Hellmanは非対称暗号化の概念を最初に公開し、アルゴリズムはDiffie–Hellman鍵交換として知られていました。その後1978年に、MITのRon Rivest、Adi Shamir、およびLeonard AdlemanがRSAアルゴリズムを公開しました。これらは、非対称暗号化の基礎と見なすことができます。

対称暗号化と比較して、非対称暗号化では、1つではなく2つのキーがあります。1つは公開鍵と呼ばれ、もう1つは秘密鍵です。理論的には、開始時にパブリックプライベートを生成できます私たちのマシンへのキーペア。秘密鍵は安全な場所に保管し、誰とも共有しないでください。名前が示すように、公開鍵は暗号化されたテキストをあなたに送りたい人なら誰でも共有できます。これで、公開鍵を持っている人はそれを使って秘密データを暗号化できます。鍵ペアがRSAアルゴリズムを使用して生成された場合、データの暗号化中に同じアルゴリズムを使用する必要があります。通常、アルゴリズムは公開鍵で指定されます。暗号化されたデータは、あなたが所有する秘密鍵でのみ復号化できます。

ソース:ダミーのSSL / TLSパート1:暗号スイート、ハッシュ、暗号化| WST(https://www.wst.space/ssl-part1-ciphersuite-hashing-encryption/


-3

暗号化暗号化の目的は、データを変換してそれを秘密に保つことです(例:誰かが読むことしかできない秘密のテキストを送信し、インターネット経由でパスワードを送信する)。

使いやすさに重点を置くのではなく、データ送信を秘密裏に送信し、送信したユーザーだけがデータを表示できるようにすることが目標です。

データを別の形式に暗号化して固有のパターンに変換し、秘密鍵で暗号化できます。秘密鍵を持っているユーザーは、プロセスを元に戻すことでメッセージを見ることができます。例(AES、BLOWFISH、RSA)

暗号化は単純に次のようになりますFhQp6U4N28GITVGjdt37hZN

ハッシュ arbitary入力を受け取り、固定長文字列を生成するように、技術的に我々はそれを言うことができます。

これらの中で最も重要なことは、出力から入力に移動できないことです。これにより、特定の情報が変更されていない強力な出力が生成されます。このプロセスでは、入力を受け取ってハッシュし、送信者の秘密鍵で送信します。受信者が受信すると、送信者の公開鍵で検証できます。

ハッシュが間違っており、ハッシュと一致しなかった場合、情報は表示されません。例(MD5、SHA .....)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.