【发布时间】:2026-02-19 14:30:01
【问题描述】:
我以前从未加密过密码,这就是我在this article 的帮助下想到的。这篇文章没有加盐,所以我必须自己弄清楚:
UTF8Encoding encoder = new UTF8Encoding();
byte[] salt = new byte[8];
new Random().NextBytes(salt);
byte[] encodedPassword = encoder.GetBytes(txtPassword.Text);
byte[] saltedPassword = new byte[8 + encodedPassword.Length];
System.Buffer.BlockCopy(salt, 0, saltedPassword, 0, 8);
System.Buffer.BlockCopy(encodedPassword, 0, saltedPassword, 8, encodedPassword.Length);
byte[] encryptedPassword = new MD5CryptoServiceProvider().ComputeHash(saltedPassword);
byte[] saltedEncryptedPassword = new byte[8 + encryptedPassword.Length];
System.Buffer.BlockCopy(salt, 0, saltedEncryptedPassword, 0, 8);
System.Buffer.BlockCopy(encryptedPassword, 0, saltedEncryptedPassword, 8, encryptedPassword.Length);
saltedEncryptedPassword 存储在数据库中。正如您可能注意到的那样,我在将涉及盐的字节数组连接在一起时遇到了一些麻烦。我做对了吗,还是有更好的方法?谢谢。
【问题讨论】:
-
没有使用 MD5 加密密码的好方法。您应该使用 scrypt 或 PBKDF2 散列密码。
-
无法使用 MD5 对密码进行加密。它是一种单向哈希函数,而不是加密算法。
-
这里的变化很难跟上。随着更多的计算能力变得可用,破解一些较弱的方法就更容易了。虽然 MD5 在过去就足够了,但有一些更新的方法需要更多的计算能力才能破解。
-
除了明显错误地选择了 MD5 而不是 PBKDF2、bcrypt 或 scrypt,你的加盐方法也很糟糕。为您的盐使用加密 PRNG,而不是当前时间。
-
只是重复 SLaks 的观点:单次迭代 SHA-2 与 MD5 一样错误,所以我对所有推荐的答案都投了反对票。
标签: c# encryption passwords md5