我想在我的桌面应用程序(基于WPF)中使用Windows.Security.Credentials.PasswordVault来安全地存储用户的密码.我设法使用此MSDN文章访问此Windows 10 API .
我做了一些实验,似乎可以从任何其他桌面应用程序读取从一个桌面应用程序(不是本机UWP应用程序)写入PasswordVault的任何数据.即使使用Desktop Bridge技术打包我的桌面应用程序,因此具有包标识也无法修复此漏洞.
任何想法如何解决这个问题,并能够从其他应用程序安全存储应用程序的数据?
更新:似乎PasswordVault没有为DPAPI增加额外的安全性.案件结案,结果为否定.
我构建了一个C#程序,在Win10上运行.我想通过按下按钮从该程序发送电子邮件(计算结果).我把来自:电子邮件地址和主题:等等放在C#属性中,但是我不想在程序的任何地方放置明文密码,而且我不希望用户输入密码每次发送邮件时为服务器.
可以这样做吗?
如果是这样,如何(一般)?
我正在考虑将所有电子邮件信息(包括服务器的加密密码)放在数据文件中,以便在程序启动期间读取.
或许Win10有一个设施...
我一直在MSDN上阅读这篇关于Rfc2898DeriveBytes的文章.以下是它们提供的示例加密代码.
string pwd1 = passwordargs[0];
// Create a byte array to hold the random value.
byte[] salt1 = new byte[8];
using (RNGCryptoServiceProvider rngCsp = ne RNGCryptoServiceProvider())
{
// Fill the array with a random value.
rngCsp.GetBytes(salt1);
}
//data1 can be a string or contents of a file.
string data1 = "Some test data";
//The default iteration count is 1000 so the two methods use the same iteration count.
int myIterations = 1000;
try
{
Rfc2898DeriveBytes k1 = new …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个桌面应用程序,它将更新发送到我正在开发的网络服务。
理想情况下,应用程序只需配置一次并部署到网络共享。配置应用程序时,用户将输入用于在 Web 服务中进行身份验证的密码。之后,将创建一个令牌以用于将来的连接。
这将允许任何有权访问网络共享的计算机(即使它不是配置应用程序的计算机)只运行应用程序(将连接到 Web 服务),而无需输入任何凭据(因为令牌具有已被保存)。
以下是我尝试/思考过的一些事情:
使用 C# 之类的方法序列化令牌SecureString并将其存储在文件中:这是我所拥有的最好的方法。但显然,如果有人获得了密钥文件的访问权限,则逆转非常简单。
这个答案建议使用Windows 数据保护 API (DPAPI)(在 C# 中,ProtectedData该类),但显然,这将只允许最初保存凭据的用户访问它们,这是行不通的,因为我必须访问受保护的凭据。来自多个用户/设备的数据。
将令牌作为参数传递给应用程序:这只会更改我要存储令牌的位置(例如,在调用程序的批处理文件或操作系统任务上),但我认为它不再有效安全的。
我正在使用Rfc2898DeriveBytes从用户提供的字符串密码安全地生成加密密钥和初始化向量,以使用对称加密(例如AesManaged).
我将密码的SHA1哈希值作为salt参数Rfc2898DeriveBytes.这可以吗?如果没有,那么我应该从哪里获取盐?解密时我需要相同的盐,对吧?所以我必须将它存储在未加密的地方 - 不安全.如果我必须安全地存储它,那它就变成另一个"密码",不是吗?
void SecureDeriveKeyAndIvFromPassword(string password, int iterations,
int keySize, int ivSize, out byte[] key, out byte[] iv)
{
// Generate the salt from password:
byte[] salt = (new SHA1Managed()).ComputeHash(Encoding.UTF8.GetBytes(password));
// Derive key and IV bytes from password:
Rfc2898DeriveBytes derivedBytes = new Rfc2898DeriveBytes(password, salt, iterations);
key = derivedBytes.GetBytes(keySize);
iv = derivedBytes.GetBytes(ivSize);
}
Run Code Online (Sandbox Code Playgroud)
我已经看到使用恒定(硬编码)盐,我看到人们抱怨它.我认为从密码中获取盐会更好,但我不确定这是一个最佳解决方案.
不久,我有一个需要加密的文件,以及用户输入的密码字符串.如何正确使用Rfc2898DeriveBytes导出安全加密密钥和IV?
谢谢.
编辑:
谢谢你的回答.我现在明白,盐的主要(也许只是?)目的是使彩虹表的生成变得不可能 - 你不能预先生成"P @ $$ w0rd"的散列,因为它对每种可能都有不同的散列盐值.我完全理解这一点,但是......这与对称加密真的相关吗?我不是把哈希存放在任何地方吗?因此,即使攻击者拥有所有可能的密码组合的彩虹表,他也做不了多少,对吧?
所以,我现在的问题是:与使用密码派生(或甚至硬编码)盐相比,在使用对称加密算法(如AesManaged of .NET)时,在每次加密操作中使用随机盐是否有任何优势?
我正在创建一个C#应用程序,它将在Kiosk风格的环境中锁定功能(键组合,窗口任务栏等).其中一个要求是,某些人仍然可以使用密钥组合和密码来突破应用程序.
应用程序本身已完成,但我还没有找到一种存储和检查密码的好方法.一切都应该存储在本地(没有检查网络数据库或其他).如何定义用于解锁我的应用程序的密码,同时使其灵活(无需重新编译应用程序即可更改密码).我怎样才能以安全的方式实现这一目标?
我正在开发一个客户端作为UWP.我可以毫无问题地处理oauth登录,但我不确定我应该在哪里为用户保存oauth access_token.ApplicationData.LocalSettings是一个存储此类信息的安全位置吗?
我想用密码加密和解密字符串.我使用C#和WinRT(MetroStyle).有人加密/解密吗?
我有一个可以进行各种 API 调用的脚本。该脚本将独立运行,因此我需要将这些服务和其他服务的登录凭据存储在本地配置文件中。
我非常确定将这些敏感数据以明文形式存储在 .txt 文件中是一个可怕的想法。我怎样才能更安全地做到这一点?
我看到了一个类似的问题,但答案非常特定于 C#。如何安全地保存用户名/密码(本地)?
我没有要发布的代码,因为这只是一个普遍的问题.
我目前有一个网站,我有身份验证设置.我有网站的成员,我将他们的凭据存储在数据库中.这完全没问题.常识适用于此,我知道我不应该将用户信息存储为纯文本.然而,当我研究的时候,我看到哈希字符串很容易做到.在整个开发过程中,我发现还有一种方法可以解密这些密码,从而引发了我的这个问题.只是哈希密码吗?我应该和它一起做某种加密吗?什么是最佳做法?我没有在网上找到任何好的信息......
string dec = FormsAuthentication.HashPasswordForStoringInConfigFile(Login1.Password, "SHA1");
提前感谢任何有用的输入.
c# ×9
security ×5
encryption ×4
.net ×3
passwords ×2
config ×1
credentials ×1
cryptography ×1
kiosk ×1
python ×1
uwp ×1
web-services ×1
windows-10 ×1
windows-8 ×1
wpf ×1