1

私の Web アプリケーションは Web API にログインします。これにはメールアドレスとパスワードが必要です。API にはプレーン テキストのパスワードが必要なため、データベースでこれらをハッシュできません。

プレーン テキスト、xor、または base64 よりも安全な方法で Web API 資格情報を保存するにはどうすればよいですか? この種のことに対する「適切な」解決策はありますか?

4

1 に答える 1

2

はい、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ます。

于 2013-07-15T15:08:07.790 に答える