.NET中如何安全地存储认证信息(C#)

.NET中如何安全地存储认证信息(C#)

TODO: 本文由 赤石俊哉 翻译整理,您能够将本文自由地用于学习交流。如需用于其余用途请征得做者的赞成。
原文连接:How to securely save username/password (local)? - StackOverFlow算法

验证输入的用户名和密码

若是你只但愿验证输入的用户名和密码是否匹配,可使用Rfc2898DerivedBytes类(即PBKDF2)。这比起使用诸如三次DES以及AES这样的加密算法来讲要更安全一些,由于从RFC2898DerivedBytes产生的结果逆推出密码原文是不可行的。你只能将密码转换成PBKDF2的结果。
你能够参考使用密码的SHA1哈希值做为密码字符串推导加密秘钥和向量的盐,是否可行?
这里面有一个示例,也讨论了在WinRT/Metro环境的.Net环境下C# Metro风格的密码字符串加密解密数组

存储密码

若是你但愿存储密码以便之后进行复用,你可使用Windows Data Protection API(DPAPI)
它是使用了操做系统生成而且保护的密钥进行三次DES加密算法来加密解密信息的。
这就意味着你的应用程序能够省去一个大麻烦,那就是它不须要去关心密钥如何去生成以及保护。安全

C#中,使用System.Security.Cryptography.ProtectedData类。
举个例子,使用ProtectedData.Protect()加密一小段数据:ide

// 须要被保护的数据。使用Encoding.UTF8.GetBytes()将一个字符串转换成byte数组。
byte[] plaintext;

// 生成一个附加的熵(用于向量的初始化)
byte[] entropy = new byte[20];
using(RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider()){
    rng.GetBytes(entropy);
}

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

安全地存储熵值(entropy)和加密后文本(ciphertext),好比存储在一个只有当前用户具备读写权限的文件或者注册表项内。
在程序中,须要访问原始数据的时候,只须要使用ProtectedData.Unprotect()学习

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

还有一些其余要注意的安全考虑,好比,避免直接将像密码这类的隐私信息存储为一个字符串(string),这样作的话在内存中是不可被通知的,因此其余人要是查看程序的内存或者Dump内存的时候,就会看到密码。
使用SecureString或者一个byte数组来代替。在不须要使用密码的时候,尽快释放掉他们,或者是所有填写0。加密

相关文章
相关标签/搜索