小编典典

如何安全保存用户名/密码(本地)?

c#

我正在制作Windows应用程序,您需要先登录。
帐户详细信息包含用户名和密码,它们需要保存在本地。
这只是安全问题,因此使用同一台计算机的其他人看不到每个人的个人数据。
保存此数据的最佳/最安全的方法是什么?

我不想使用数据库,所以我尝试了一些与资源文件有关的事情。
但是,由于我对此很陌生,因此我不确定自己在做什么以及应该在哪里寻找解决方案。


阅读 1012

收藏
2020-05-19

共1个答案

小编典典

如果您只是要验证/验证输入的用户名和密码,请使用Rfc2898DerivedBytes类(也称为基于密码的密钥派生功能2或PBKDF2)。这比使用诸如Triple
DES或AES之类的加密方法更安全,因为没有实际的方法可以将RFC2898DerivedBytes的结果返回到密码。您只能从密码转到结果。请参阅从密码字符串派生加密密钥和IV时,可以将SHA1密码哈希用作盐吗?有关.Net或字符串的示例和讨论,请使用密码c#Metro
Style
for WinRT / Metro
进行加密/解密

如果您要存储密码以供重复使用,例如将其提供给第三方,请使用Windows数据保护API(DPAPI)。它使用操作系统生成和受保护的密钥以及三重DES加密算法来加密和解密信息。这意味着您的应用程序不必担心生成和保护加密密钥,这是使用加密技术时的主要问题。

在C#中,使用System.Security.Cryptography.ProtectedData类。例如,要加密一条数据,请使用ProtectedData.Protect()

// Data to protect. Convert a string to a byte[] using Encoding.UTF8.GetBytes().
byte[] plaintext;

// Generate additional entropy (will be used as the Initialization vector)
byte[] entropy = new byte[20];
using(RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
{
    rng.GetBytes(entropy);
}

byte[] ciphertext = ProtectedData.Protect(plaintext, entropy,
    DataProtectionScope.CurrentUser);

安全地存储熵和密文,例如在设置了权限的文件或注册表项中,这样只有当前用户才能读取它。要访问原始数据,请使用ProtectedData.Unprotect()

byte[] plaintext= ProtectedData.Unprotect(ciphertext, entropy,
    DataProtectionScope.CurrentUser);

请注意,还有其他安全注意事项。例如,避免将诸如密码之类的机密存储为string。字符串是不可变的,因为无法在内存中通知它们,因此查看应用程序内存或内存转储的人可能会看到密码。请改用SecureString或byte [],并记住在不再需要密码时立即进行处理或清零。

2020-05-19