5

以下のコードを使用してパスワードをレジストリに保存していますが、元に戻すにはどうすればよいですか? 以下のコードは私のものではありませんが、うまく暗号化されています。

ありがとう

using System.Security.Cryptography;

public static string EncodePasswordToBase64(string password)
{  byte[] bytes   = Encoding.Unicode.GetBytes(password);
   byte[] dst     = new byte[bytes.Length];
   byte[] inArray = HashAlgorithm.Create("SHA1").ComputeHash(dst);
   return Convert.ToBase64String(inArray);
}
4

11 に答える 11

32

SHA1 はハッシュアルゴリズムであり、暗号化アルゴリズムではありません。ハッシュ アルゴリズムは、データをそのデータのハッシュに変換する一方向関数ですが、ハッシュから元のデータを取得することはできません。暗号化アルゴリズムは、データを暗号化されたデータに変換する双方向関数であり、暗号化されたデータを元のデータに戻すことができます。

于 2008-11-06T15:28:57.087 に答える
12

パスワードを安全に保存して読み戻せるようにするには、ProtectedDataクラスを使用します。

public static string ProtectPassword(string password)
{
    byte[] bytes = Encoding.Unicode.GetBytes(password);
    byte[] protectedPassword = ProtectedData.Protect(bytes, null, DataProtectionScope.CurrentUser);
    return Convert.ToBase64String(protectedPassword);
}

public static string UnprotectPassword(string protectedPassword)
{
    byte[] bytes = Convert.FromBase64String(protectedPassword);
    byte[] password = ProtectedData.Unprotect(bytes, null, DataProtectionScope.CurrentUser);
    return Encoding.Unicode.GetString(password);
}
于 2008-11-06T15:54:03.760 に答える
8

ユーザーがシステムにアクセスするためにパスワードとして入力したものは何でも取得し、同じ方法で暗号化し、暗号化された値を比較します。これが通常のアプローチです。SHA1 がトラップドア暗号化であることは確かです。つまり、バックトラックできません。

于 2008-11-06T15:28:18.197 に答える
7

あなたはそうしない。

SHA1 はハッシュであり、暗号化ではありません。これは一方向の操作です。逆変換は不可。

(わかりました、これは厳密には真実ではありません。可能性のある SHA1 値とプレーン テキスト値のテーブル、レインボー テーブルがある場合は、運がいいかもしれません)

また、現在、レインボー テーブル攻撃に対して脆弱であるため、ハッシュをソルティングする必要があります。ジェフは彼のブログでこれについてもう少し話しています

于 2008-11-06T15:29:20.050 に答える
3

わかりました、これがあなたの特定の Q に答えていないことはわかっていますが、なぜそれを元に戻したいのですか?

認証を提供するために比較する場合、標準的なアプローチは、このテキストも暗号化し、保存されたパスワードを提供されたパスワードと比較することです。

これは、元のパスワードを解読する必要がないことを意味するため、より安全です。

于 2008-11-06T15:29:39.627 に答える
2

System.Security.Cryptography.ProtectedData クラスを使用するには、System.Security への参照をプロジェクトに追加する必要があります。

(References フォルダーを右クリックし、[参照の追加...] を選択し、.NET タブで System.Security を見つけます)

于 2008-11-06T19:02:44.207 に答える
2

ハッシュを使用するポイントの 1 つは、ハッシュを計算して戻すことができないことだと思います。

他の誰かが言ったように、ユーザーのパスワードからハッシュを計算し、保存されているハッシュ値と比較します。

于 2008-11-06T15:28:20.147 に答える
1

ええと、ちょっと興味がありますが、同じ長さのすべてのパスワードに対して同じハッシュを返すのではないでしょうか?

于 2008-11-06T15:37:35.150 に答える
0

XMLEncryptedData クラスが最近追加されたことに気付きました。データを XML ファイルに暗号化する場合、XMLEncryptedData メソッドは DPAPI メソッドよりも望ましいですか?

于 2008-12-30T02:29:15.520 に答える
0

上記の独自のコード スニペットを使用して、ユーザーが最初にパスワードを選択したときにそのメソッドを呼び出しますが、パスワード文字列のどこかにソルトと呼ばれるものをパスワードに追加します (通常は先頭または末尾)。次に、ユーザーが後で認証を試みるときにパスワードを入力し、同じ方法でハッシュと一緒にそのパスワードを実行します。2 つのハッシュが等しい場合、パスワードが等しく有効である可能性は統計的に非常に優れています。

そうは言っても、SHA1 には弱点があることが知られており、より強力なアルゴリズムを選択する必要があります。SHA ファミリーにとどまりたい場合は、SHA512 が非常に適しています。

于 2008-11-06T16:01:25.820 に答える
0

ハッシュではなく暗号化を使用したい。SHA は問題ありませんが、暗号化方式を使用してください。暗号化の問題は常に、その鍵をどこに置くかです。これがワークステーションであるかサーバーであるかについては言及していません。サーバーでは、ACL を使用して reg キーへのアクセスを制限する方が良いと思います。とにかく、管理者は通常、暗号化キーにアクセスできます...どこかである程度の信頼が必要です。ワークステーションでは、暗号化を使用してキーをコードに保存するか、証明書を使用して、少なくとも企業環境でアクセスを制限できます...非販売ソフトウェア)。

ProtectedData クラスを使用できますが、キーの使用にユーザー プロファイルを使用することに注意してください。そのため、必要なキーを持つプロファイルを持つユーザーになりすます必要があります。これは些細なことかもしれませんし、頭の痛い問題やセキュリティの問題を引き起こすかもしれませんし、しないかもしれません。

于 2008-11-06T16:44:44.390 に答える