【发布时间】:2012-12-16 06:04:12
【问题描述】:
我目前正在开发一个 Visual Studio C# Windows 窗体项目。但是,我对 SHA256 + salted 的工作方式感到困惑。我在网上找到了一些例子,但无法理解如何调用这个函数。
我想在连接到数据库 (Microsoft Access 2010) 的登录表单中调用此函数。
- 如何通过单击按钮并阅读
来自
Textbox的密码? - 如何在
Messagebox.Show方法? (出于我的测试目的) -
有没有可能 比较两个文本(散列和加盐)并给出肯定的结果?
public static string sha256encrypt(string phrase, string UserName) { string salt = CreateSalt(UserName); string saltAndPwd = String.Concat(phrase, salt); UTF8Encoding encoder = new UTF8Encoding(); SHA256Managed sha256hasher = new SHA256Managed(); byte[] hashedDataBytes = sha256hasher.ComputeHash(encoder.GetBytes(saltAndPwd)); string hashedPwd = String.Concat(byteArrayToString(hashedDataBytes), salt); return hashedPwd; } public static string byteArrayToString(byte[] inputArray) { StringBuilder output = new StringBuilder(""); for (int i = 0; i < inputArray.Length; i++) { output.Append(inputArray[i].ToString("X2")); } return output.ToString(); } private static string CreateSalt(string UserName) { string username = UserName; byte[] userBytes; string salt; userBytes = ASCIIEncoding.ASCII.GetBytes(username); long XORED = 0x00; foreach (int x in userBytes) XORED = XORED ^ x; Random rand = new Random(Convert.ToInt32(XORED)); salt = rand.Next().ToString(); salt += rand.Next().ToString(); salt += rand.Next().ToString(); salt += rand.Next().ToString(); return salt; }
如何使用盐创建 SHA256 哈希?
shavalue = (sha256encrypt("password", "username");
saltedandhashtext = CreateSalt(shavalue);
【问题讨论】:
-
如果不阅读并理解它,我不确定我是否会信任这段代码,因为它调用 SHA-256“加密”并且最多只使用 256不同的盐值...
-
我不会浪费任何时间让这段代码工作。把它扔掉,然后从新代码开始。特别是使用
Rfc2898DeriveBytes,它使用一个拉伸的哈希函数并且可以自己创建一个盐。 -
由于您正在对密码进行哈希处理,因此您应该考虑使用像 PBKDF2 这样的慢速密钥派生函数,在 CSharp 中它可以使用 Rfc2898DeriveBytes 类来实现,正如 CodesInChaos 已经提到的那样。
标签: c# hash comparison