暗号化を元に戻すことはできませんか?


9

暗号化された文字列は復号化できないため、元の値が永久に失われるという印象を受けています。

ただし、次の文字列が常に「dominic」(私の名前)と等しい場合、それを逆にする論理的な方法はありません。それはランダムではなく、日付/時刻に基づいているわけではありませんが、それには論理的な方法がありますか?

0WrtCkg6IdaV/l4hDaYq3seMIWMbW+X/g36fvt8uYkE=

「dominic」(文字列)を何回または何回暗号化しても、常に上記と同じになります。それで、そのような文字列を解読する方法はありませんか?

私が話していることの例:

public string EncryptPassword(string password)
{
    return Convert.ToBase64String(
        System.Security.Cryptography.SHA256.Create()
        .ComputeHash(Encoding.UTF8.GetBytes(password)));
}

3
名前の暗号化ハッシュ(パスワードでよく使用される)について話していますか?または暗号化(権限のある人物が解読することを目的としています)?

11
SHA256は暗号化アルゴリズムではなく、暗号化ハッシュ関数です。それは一方通行機能

1
義務的な免責事項:ハッシュをソルトします(en.wikipedia.org/wiki/Salt_(cryptography))。さらに、SHA256は、GPUなどを使用したブルートフォース攻撃に問題がないほど速すぎる傾向があります。PBKDF2やscryptなどを使用することをお勧めします。
Maciej Piechotka 2013

7
ハッシュは肉挽き器のようなものです。牛を牛挽肉にすることはできますが、その逆はできません。
ニールマクギガン2013

1
公開鍵/秘密鍵の暗号化で混乱していますか?誰かがあなたの公開鍵でメッセージを暗号化した場合、その人は自分でそのメッセージを解読することはできません。これを解読できるのはあなただけです-そしておそらくNSA、Mossad、FSBとTiroler Geheimdienst。
ott-- 2013

回答:


39

暗号化はいつでも元に戻すことができます。暗号化のポイントは、メッセージを受け取って秘密鍵で暗号化し、その鍵を持っている他の人だけが暗号化を元に戻してメッセージを読むことができるようにすることです。

ここで見ているのはハッシュです。これは暗号化とは異なりますが、ハッシュの実装には暗号化技術がよく使用されます。ハッシュの考え方は、複雑な数学的手法を使用して、繰り返し可能な古い値にマップする新しい値を構築することです。キーはなく、逆にすることを意図していません。暗号学的に強力なハッシュはA、ハッシュがvalue Bである値がある場合、意図的にCハッシュする別の値を意図的に作成することが非常に難しいという数学的な特性を使用して作成されBます。

ハッシュは認証に使用されるため、元に戻す必要はありません。ユーザー名とパスワードを教えてもらったら、私のデータベースにそのパスワードを保存してほしくない。誰かがハッキングして私のデータベースにアクセスすると、彼らはあなたのパスワードを手に入れることができるからだ!代わりに、データベースにパスワードのハッシュを保存します。次に、ログイン時に、あなたと一致するユーザー名が存在するかどうか、送信したパスワードのハッシュと一致するパスワードエントリがあるかどうかを確認します。そうである場合は、認証されます。ハッシュの衝突を作成するのは非常に難しいためです(同じ値にハッシュする2つの値)と適切なハッシュで、使用したパスワードが正しいものであることはほぼ確実です。

強力な暗号ハッシュのもう1つの特性は、元に戻すことが非常に難しいことです。値0WrtCkg6IdaV/l4hDaYq3seMIWMbW+X/g36fvt8uYkE=は "dominic"のハッシュであることはわかっていますが、それを考え出しただけですが0WrtCkg6IdaV/l4hDaYq3seMIWMbW+X/g36fvt8uYkE=、それがわからず、どこから探し始めればよいかわからない場合は、文字通り数十億ドルかかる可能性があります。ハッシュが良いものである場合、オリジナルが「ドミナント」であったと理解するのに何年もかかる。繰り返しになりますが、これはパスワードリストが盗まれた場合の付随的な損害を防ぐのに役立ちます。


2
既知の単語のリストを取得して、ハッシュ一致が見つかるまでループすることはできませんか?これが、ウェブサイトがパスワードに大文字と数字を追加してそれらをより安全にすることを提案する理由ですか?
user1477388 2013

15
@ user1477388:はい、それはだまさにウェブサイトはそれをお勧めする理由。...明白な理由のために「辞書攻撃」とは呼ばれていますし、辞書にない単語を使用すると、それらに対して安全であるための重要なステップである:それは、ハッシュされたパスワードを攻撃するのはよく知られている方法です
メイソンウィーラー

1
これは私の「これらはどうにかして元に戻すことができないとは信じられない」というセキュリティに良い洞察を持っているようです。security.stackexchange.com/questions/11717/…それらを元に戻す必要はありません。気になるだけです。
user1477388 2013

3
別の提案は、ハッシュされる前に各パスワードに固有のものを追加することです。1文字のパスワードの違いにより、完全に異なるハッシュが作成されます。これは、すべてのハッシュ結果が一意になるという考え方です。それ以外の場合、ハッカーが「password123」という単語のハッシュを発見すると、その特定のハッシュを持つすべてのユーザー名に対してそれを使用することがわかります。あなたはこの種のもののために良い頭を持っているように聞こえますが、幸運です。
Katana314 2013

1
@MasonWheeler:辞書にない単語を使用することは本当に必要ではありません。特に、典型的な攻撃で使用される「辞書」がOxford辞書に似ていることを考えると、むしろパスワードでよく使用されることが知られている文字列のリストです。 。これらの単語を避けようとするのではなく、たとえば2000個程度の単語のリストから5つのランダムな単語を選択することをお勧めします。このようなパスフレーズは、2000語の辞書がわかっていても、総当たりするのにほぼ100倍長くかかります。 64のうち8のランダムな文字以上の力
tdammers

9

あなたがしていることは、それ自体「暗号化」ではありません。それは「ハッシュ」です。この2つの主な違いは、暗号化簡単に元に戻せることです(もちろん正しいキーを使用)。一方、ハッシュは元のメッセージを最初に知っている以外の状況では、元に戻すのが非常に難しいように設計されています。

理論的には、ハッシュは「ランダムなオラクル」をシミュレートします。これは、アイデティックなメモリを備えた仮想的なホムンクルであり、範囲の上限のない完全に一意の完全にランダムな数値を生成する方法です。この小さな男にメッセージを与えると、2つのことが起こります。彼は以前にメッセージを見たことがなく、その場合、彼は新しい乱数を生成してそれをダイジェストとしてあなたに渡します、または彼は以前にそのメッセージを見たことがあります。初めて。その理論モデルでは、メッセージとそのダイジェストの間にゼロの関係があり、RNGから単一の番号が2回現れることはないため、衝突の可能性はありません。

残念ながら、理想的なランダムオラクルはありません。このアイデアには、デジタル実装には実用的な不可能性があります。たとえば、オラクルがどこでも誰でもハッシュしたすべてのメッセージを効率的に保存して効率的に呼び出す機能や、クライアントが数百または数千桁の数値を受け入れる機能などです。長さで。代わりに、メッセージ自体に作用する不可逆的な(一方向の)数学演算であるハッシュ関数を使用して、明確な変換なしで確定的な変換(同じメッセージ=>同じハッシュ)を作成します。ハッシュと元のメッセージの関係。コメントで述べたように、メッセージに体系的な変更を加えることによって生成されるハッシュ値には、予測可能な変更はありません。理想的には、メッセージの1ビットに変更が加えられた場合、ダイジェストの各ビットが変更される可能性は50%です。

ハッシュ関数には多くの用途があります。これらは、両方の当事者がプレーンテキストのシークレットを知る必要なしにチャレンジ検証(パスワードなどのログイン資格情報を考える)に使用され、メッセージが改ざんまたは破損されていないことを確認するためのチェックサムとして使用されます。いわゆる「作業証明」シナリオでも使用されます。完了するのは難しいが検証が簡単な計算タスク。

SHA256ハッシュダイジェストを効率的にリバースして、そのハッシュをもたらすメッセージ(任意のメッセージ)を生成する方法を見つけたとしたら、それは実際にはハッシュが根本的に壊れていることを示す証拠です。SHA256は実際には安全であると考えられています。つまり、ハッシュダイジェストから始めて、すべての可能性を試してみるよりも作業が少なくてすむメッセージ(SHA-256の場合は理想的には2 ^ 256〜= 10 ^ 77の可能性)。


理想的なハッシュ関数では、入力の1ビットの変更により、出力ビットの50%が変更されることにも言及する価値があります。アバランシェ効果と呼ばれています
CVn 2013

2
@MichaelKjörling:正確に言うと、各ビットが50%の確率で変化することを期待する必要があります。これは、平均でビットの50%が変化することを期待することとは異なります(ただし暗示する)。
ディートリッヒエップ2013

@DietrichEpp確かに、そして私がリンクしたWikipediaの記事はそれを明らかにしていますが、エンドユーザーが2つの入力間で変化するビット数を定量化する方が簡単です。
CVn 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.