私の Web アプリケーションは Web API にログインします。これにはメールアドレスとパスワードが必要です。API にはプレーン テキストのパスワードが必要なため、データベースでこれらをハッシュできません。
プレーン テキスト、xor、または base64 よりも安全な方法で Web API 資格情報を保存するにはどうすればよいですか? この種のことに対する「適切な」解決策はありますか?
私の Web アプリケーションは Web API にログインします。これにはメールアドレスとパスワードが必要です。API にはプレーン テキストのパスワードが必要なため、データベースでこれらをハッシュできません。
プレーン テキスト、xor、または base64 よりも安全な方法で Web API 資格情報を保存するにはどうすればよいですか? この種のことに対する「適切な」解決策はありますか?
はい、ProtectedDataクラスがあります。Windows ユーザー アカウントに関連付けられたオブジェクトを暗号化できるため、user.config ファイルが別のユーザー/コンピューターにコピーされた場合、機能しません。
設定ファイルで、ApiUsername
とという名前の 2 つの文字列プロパティを作成ApiPassword
し、上部にある [コードを表示] をクリックして、次の関数を追加します。
internal sealed partial class Settings {
private MD5 md5 = MD5.Create();
public global::System.Net.NetworkCredential ApiLogin
{
get
{
global::System.Net.NetworkCredential tmp = null;
if (ApiPassword != "")
{
tmp = new System.Net.NetworkCredential();
tmp.UserName = ApiUsername;
try
{
tmp.Password = System.Text.Encoding.UTF8.GetString(ProtectedData.Unprotect(Convert.FromBase64String(ApiPassword), md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(ApiUsername.ToUpper())), DataProtectionScope.CurrentUser));
}
catch
{
tmp.Password = "";
}
}
return tmp;
}
set
{
global::System.Net.NetworkCredential tmp2 = value;
ApiUsername = tmp2.UserName;
ApiPassword = Convert.ToBase64String(ProtectedData.Protect(System.Text.Encoding.UTF8.GetBytes(tmp2.Password), md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(tmp2.UserName.ToUpper())), DataProtectionScope.CurrentUser));
}
}
}
ApiLogin
これにより、破棄されたパスワードを含む NetworkCredential を含むというアクセス可能なプロパティが追加されます。資格情報をディスクに保存すると、他のユーザーにコピーできない暗号化された保護された形式で保存されます。
復号化に失敗すると、返された資格情報のパスワードが空白に設定されます。その単一のマシンの任意のユーザー アカウントで説明を機能させたい場合は、ProtectionScope を に変更しDataProtectionScope.LocalMachine
ます。