管理安全密码

时间:2015-04-14 05:36:05

标签: c# passwords password-protection

我的程序要求输入密码并将其保存在文本文件中,下次运行我的程序时,如果文本文件存在,则会询问密码,并将其与文本文件中的密码进行比较。

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

这是一个练习,我的目的是了解我是否正在编写商业应用程序,然后使用哪种技术来存储具有更强大安全性的密码?

2 个答案:

答案 0 :(得分:1)

这个想法是加密或散列密码,但从不解密。即你以一种不可逆的方式转换你的密码。

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

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

答案 1 :(得分:1)

存储密码的位置并不重要,只要您只存储它们的哈希值即可。一个文本文件会做得很好,重要的是你使用salt和一个带有成本因子的慢哈希函数。像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教程。