管理安全密码

manage a secure password

我的程序要求输入密码并将其保存在文本文件中,下次我 运行 我的程序如果文本文件存在,它会要求输入密码,然后我将其与文本中的密码进行比较文件.

现在,在现实世界中,我知道没有使用文本文件,但我不知道如何改进我的技术,因为无论加密算法如何,文本文件对每个人和其他解决方案都是可读的注册表项相同。

这是一个练习,我的目的是了解如果我正在编写商业应用程序,那么我应该使用什么技术来存储具有更强大安全性的密码?

想法是对密码进行加密或散列处理,但从不解密。 IE。您以不可逆的方式转换密码。

  • 第一次输入密码时,您(单向)加密 密码并存储它。
  • 当用户尝试登录时,输入的密码会再次加密并与存储的密码进行比较。

answer中已经提供了代码示例:

byte[] data = System.Text.Encoding.ASCII.GetBytes(inputString);
data = new System.Security.Cryptography.SHA256Managed().ComputeHash(data);
String hash = System.Text.Encoding.ASCII.GetString(data);

您的程序将存储/比较 hash 值而不是普通密码。

代码可以而且应该得到进一步批准。攻击者可以创建加密密码的大型字典/彩虹表,并将它们用作密码破解的查找。这可以通过在要加密的密码中添加一些“salt”来防止。表格的更多详细信息请参阅此 answer

将密码存储在何处并不重要,只要您只存储密码的哈希值即可。文本文件会做得很好,重要的是您使用盐和具有成本因子的慢散列函数。 MD5 或 SHA* 等算法不适合散列密码,因为它们速度太快,因此很容易被暴力破解。

BCrypt.NET 实现了 BCrypt 算法,该算法旨在散列密码。它会自动添加加密安全盐并将其包含在生成的 BCrypt 哈希中。

// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
string hashToStoreInDb = BCrypt.HashPassword(password);

// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from existingHashFromDb.
bool isPasswordCorrect = BCrypt.Verify(password, existingHashFromDb);

另一个好的算法是PBKDF2,crackstation.net有一个很好的code example.

如果你对更详细的信息感兴趣,你可以看看我关于safely storing passwords的教程。