gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 15:31:59 24 4
gpt4 key购买 nike

我正在制作一个 Windows 应用程序,您需要先登录。
账户信息由用户名和密码组成,需要保存在本地。
这只是一个安全问题,所以使用同一台计算机的其他人无法看到每个人的个人数据。
保存这些数据的最佳/最安全的方法是什么?

我不想使用数据库,所以我尝试了一些资源文件。
但由于我对这个有点陌生,所以我不完全确定我在做什么以及我应该在哪里寻找解决方案。

最佳答案

如果您只是要验证/验证输入的用户名和密码,请使用 Rfc2898DerivedBytes类(也称为基于密码的 key 派生函数 2 或 PBKDF2)。这比使用 Triple DES 或 AES 等加密更安全,因为没有实用的方法可以从 RFC2898DerivedBytes 的结果返回到密码。您只能从密码到结果。参见 Is it ok to use SHA1 hash of password as a salt when deriving encryption key and IV from password string? .Net 或 String encrypt / decrypt with password c# Metro Style 的示例和讨论适用于 WinRT/Metro。

如果您存储密码以供重复使用,例如将其提供给第三方,请使用 Windows Data Protection API (DPAPI) .这使用操作系统生成和保护的 key 和 Triple DES加密算法对信息进行加密和解密。这意味着您的应用程序不必担心生成和保护加密 key ,这是使用密码学时的一个主要问题。

在 C# 中,使用 System.Security.Cryptography.ProtectedData类(class)。例如,要加密一段数据,使用 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);

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

关于c# - 如何安全地保存用户名/密码(本地)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33497616/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com