我正在制作Windows应用程序,您需要先登录。 帐户详细信息包含用户名和密码,它们需要保存在本地。 这只是安全问题,因此使用同一台计算机的其他人看不到每个人的个人数据。 保存此数据的最佳/最安全的方法是什么?
我不想使用数据库,所以我尝试了一些与资源文件有关的事情。 但是,由于我对此很陌生,因此我不确定自己在做什么以及应该在哪里寻找解决方案。
如果您只是要验证/验证输入的用户名和密码,请使用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():
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():
ProtectedData.Unprotect()
byte[] plaintext= ProtectedData.Unprotect(ciphertext, entropy, DataProtectionScope.CurrentUser);
请注意,还有其他安全注意事项。例如,避免将诸如密码之类的机密存储为string。字符串是不可变的,因为无法在内存中通知它们,因此查看应用程序内存或内存转储的人可能会看到密码。请改用SecureString或byte [],并记住在不再需要密码时立即进行处理或清零。
string