为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

茅侃侃 2019-10-05 13:15:54
我正在制作Windows应用程序,您需要先登录。帐户详细信息包含用户名和密码,它们需要保存在本地。这只是安全问题,因此使用同一台计算机的其他人看不到每个人的个人数据。保存此数据的最佳/最安全的方法是什么?我不想使用数据库,所以我尝试了一些与资源文件有关的事情。但是,由于我对此很陌生,因此我不确定自己在做什么以及应该在哪里寻找解决方案。
查看完整描述

3 回答

?
烙印99

TA贡献1829条经验 获得超13个赞

如果您只是要验证/验证输入的用户名和密码,请使用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 [],并记住在不再需要密码时立即进行处理或清零。


查看完整回答
反对 回复 2019-10-05
?
慕雪6442864

TA贡献1812条经验 获得超5个赞

DPAPI仅用于此目的。用户首次输入密码时,请使用DPAPI加密密码,并将其存储在安全的位置(用户注册表,用户应用程序数据目录,是一些选择)。每当启动该应用程序时,请检查位置以查看您的密钥是否存在,是否使用DPAPI对其进行解密并允许访问,否则将其拒绝。


查看完整回答
反对 回复 2019-10-05
  • 3 回答
  • 0 关注
  • 1393 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信