【发布时间】:2017-04-30 20:18:01
【问题描述】:
我正在尝试学习一些处理密码的好习惯。我将从我的项目中提供一些代码 sn-ps 并解释我担心和好奇的事情。
让我们从获取用户输入的代码开始,我的按钮事件代码:
string username = txtUser.Text;
string password = Hash.EncryptString(txtPass.Text);
我的想法是,将密码以明文形式存储在字符串中可能是不好的做法?我知道这可能不是解决方案(特别是因为我以明文形式将其发送到另一个方法,然后将其存储在字符串中),但在这里我调用了我创建的方法将密码转换为哈希。 “Hash”类中的EncryptString方法:
public static string EncryptString(string text) {
var sha1 = System.Security.Cryptography.SHA1.Create();
var inputBytes = Encoding.ASCII.GetBytes(text);
text = ""; //clear string
var hash = sha1.ComputeHash(inputBytes);
var sb = new StringBuilder();
for (var i = 0; i < hash.Length; i++)
sb.Append(hash[i].ToString("X2"));
return sb.ToString();
}
这里不多说,我用 SHA1 加密对密码进行哈希处理。我认为在使用后清除字符串以便不再存储密码会很聪明?
稍后在我验证或添加用户的代码中,我将获取或创建一个唯一的盐并将其与散列密码混合并再次使用 EncryptString 方法,然后再提交到数据库。
以隐私和安全的名义,这是一种好的做法吗?或者更确切地说,我的代码中目前存在哪些漏洞,我该如何修复它们?
【问题讨论】:
-
次要注意:这是一个错误命名的方法 - 它的 named 就像它正在做 wrong 的事情(加密密码),而实际上它正在做某种正确的事情(散列密码)。当然,Salt 会有很长的路要走,而且有很多 sha1 解密表等可用。
-
除了@MarcGravell 的评论,您确实应该使用 pbkdf2、bcrypt、scrypt 或 argon2 来散列密码。在这四个中,我个人推荐的是 bcrypt。
标签: c# security passwords password-protection password-encryption