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

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

我不想使用数据库,所以我尝试了一些资源文件的东西。
但是由于我对此有点新,所以我并不完全确定自己在做什么以及在哪里寻找解决scheme。

如果您要validation/validationinput的用户名和密码,请使用Rfc2898DerivedBytes类(也称为基于密码的密钥派生函数2或PBKDF2)。 这比使用Triple DES或AESencryption更安全,因为没有从RFC2898DerivedBytes的结果返回到密码的实际方法。 你只能从密码到结果。 请参阅从密码string派生encryption密钥和IV时使用密码的SHA1哈希值是否可以使用? 为例子和讨论.Net或stringencryption/解密密码c#Metro风格为WinRT /地铁。

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

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

将熵和密文安全地存储起来,比如在一个文件或registry键中设置权限,只有当前用户可以读取它。 要访问原始数据,请使用ProtectedData.Unprotect()

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

请注意,还有其他的安全考虑。 例如,避免将密码等密码存储为string 。 string是不可变的,因为它们不能在内存中通知,所以有人看着应用程序的内存或内存转储可能会看到密码。 请使用SecureString或byte [],并记住一旦密码不再需要时立即处理或归零。

我曾经使用过这个,我认为为了确保凭证坚持和最安全的方式是

  1. 您可以使用ConfigurationManager类将它们写入应用程序configuration文件
  2. 使用SecureString类保护密码
  3. 然后使用Cryptography命名空间中的工具对其进行Cryptography

这个链接将有很大的帮助,我希望: 点击这里

DPAPI就是为了这个目的。 用户input第一次使用DPAPIencryption密码,将其存储在安全位置(用户的registry,用户的应用程序数据目录,有一些select)。 无论何时启动应用程序,检查位置以查看您的密钥是否存在,是否使用DPAPI解密并允许访问,否则拒绝。

这只适用于Windows,所以如果你打算使用dotnet核心跨平台,你必须看看其他地方。 请参阅https://github.com/dotnet/corefx/blob/master/Documentation/architecture/cross-platform-cryptography.md