リモート インターフェイスを備えたデスクトップ アプリケーションがあります。リモート インターフェイスへのアクセスは、ユーザー名とパスワードによって保護されます。
これらのパスワードを安全に、できればレジストリに保存する最善の方法は何でしょうか?
リモート インターフェイスを備えたデスクトップ アプリケーションがあります。リモート インターフェイスへのアクセスは、ユーザー名とパスワードによって保護されます。
これらのパスワードを安全に、できればレジストリに保存する最善の方法は何でしょうか?
ハッシュ化されていないパスワードを保存する必要がある場合は、ProtectedData クラスの使用を検討してください。これは、Windows でデータを保護する最良の方法であるData Protection API (DPAPI)を利用します。
以下は、ProtectedData をラップし、String でデータを暗号化および復号化する 2 つの拡張メソッドを提供する小さなクラスです。
public static class DataProtectionApiWrapper
{
/// <summary>
/// Specifies the data protection scope of the DPAPI.
/// </summary>
private const DataProtectionScope Scope = DataProtectionScope.CurrentUser;
public static string Encrypt(this string text)
{
if (text == null)
{
throw new ArgumentNullException("text");
}
//encrypt data
var data = Encoding.Unicode.GetBytes(text);
byte[] encrypted = ProtectedData.Protect(data, null, Scope);
//return as base64 string
return Convert.ToBase64String(encrypted);
}
public static string Decrypt(this string cipher)
{
if (cipher == null)
{
throw new ArgumentNullException("cipher");
}
//parse base64 string
byte[] data = Convert.FromBase64String(cipher);
//decrypt data
byte[] decrypted = ProtectedData.Unprotect(data, null, Scope);
return Encoding.Unicode.GetString(decrypted);
}
}
ハッシュ化されたパスワードを保存する必要があります (レジストリまたは別の場所に)。次に、ユーザーがパスワードを入力すると、入力したもののハッシュ化されたバージョンと、保存されているハッシュ化されたバージョンをチェックします。これらが一致する場合、パスワードが一致し、ユーザーを許可できます。
このようにして、パスワードを平文で保存して、他の誰か (自分自身を含む) がアクセスしてアクセスできるようにすることはありません。
どのハッシュ アルゴリズムを使用するかについては、わかりません。たくさんの選択肢があるので、ブラインドをお勧めするのは気が進まない. いくつか見つけて評価することをお勧めします。CSharpFriendsには、良い出発点になりそうな記事があります。