【发布时间】:2013-08-19 06:22:01
【问题描述】:
我正在使用 C# 执行一些加密任务,但遇到了一个我无法弄清楚的问题。我有时会为用户密码得到非常复杂的加盐哈希字符串,并且由于某种原因,这些字符串没有正确存储在数据库中。
我正在使用从 RNGCryptoServiceProvider 类随机生成的 8 字节盐。我使用SHA256Managed 类作为我的HashAlgorithm。我从通过ASCIIEncoding.Default.GetString() 方法创建的字节中获取要存储的字符串。存储这些值的列的类型为(NVARCHAR(50), NULL)。我使用SqlCommand 类存储它们。
在单步执行我的代码并使用即时窗口时,我可以看到确切的字符串。当我打电话给cmd.ExecuteNonQuery() 时,问题似乎正在发生。我应该采取与下面不同的方式吗?
string query = @"UPDATE User SET password = @password WHERE id = @userID";
cmd = new SqlCommand(query, conn);
cmd.Parameters.AddWithValue("@password", encryptedPassword);
cmd.Parameters.AddWithValue("@userID", userID);
int rowsAffected = cmd.ExecuteNonQuery();
如果您需要任何进一步的信息,请告诉我。我只是不想在这里过多地谈论我的确切算法或它的结果。
谢谢。
【问题讨论】:
-
你是在哈希后将其转换为
hex还是base64? -
Encoding.Default.GetString 不是您如何将任意字节表示为字符串。您需要使用 base-n,例如 hex (base-16) 或 base-64。或者更好:将其存储在 varbinary 列中。顺便说一句,散列!=加密
-
哦,ASCIIEncoding.Default 实际上不是 ASCII;这实际上是静态 Encoding.Default - 本地系统的默认 ansi 代码页。但这没关系,因为你不能在这里使用 any 编码来做你想做的事情。
标签: c# string encryption salt