我的 web 应用程序登录到 web api。这需要电子邮件和密码。我不能在我的数据库中散列这些,因为 api 需要纯文本密码。
如何以比纯文本、xor 或 base64 更安全的方式存储我的 Web api 凭据?这类事情有“适当”的解决方案吗?
我的 web 应用程序登录到 web api。这需要电子邮件和密码。我不能在我的数据库中散列这些,因为 api 需要纯文本密码。
如何以比纯文本、xor 或 base64 更安全的方式存储我的 Web api 凭据?这类事情有“适当”的解决方案吗?
是的,ProtectedData类,它允许您加密绑定到 Windows 用户帐户的对象,因此如果将 user.config 文件复制到另一个用户/计算机,它将无法工作
在你的 Settings 文件中,创建两个名为ApiUsername
and的字符串属性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,当您将凭据保存到磁盘时,它将以加密保护的形式存储,无法复制给其他用户。
如果解密失败,它将在返回的凭证中将密码设置为空白。如果您希望 decrtion 在该单台计算机上的任何用户帐户上工作,请将 ProtectionScope 更改为DataProtectionScope.LocalMachine
.