【问题标题】:Encrypted string not being stored in database correctly加密字符串未正确存储在数据库中
【发布时间】: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


【解决方案1】:

尝试使用Convert.ToBase64String() 代替将字节数组编码为字符串。这应该可以解决您的问题。

【讨论】:

  • 哇!谢谢!那成功了!这与 ASCIIEncoding.Default.GetString() 有何不同?它起作用了,我只是不知道为什么。
  • @aladd04 因为你在错误的方向上使用编码:见tiny.cc/io 我讨论这个(和其他主题)
  • “编码方向错误”是什么意思?我会看看这篇文章......也许答案就在那里:)哈哈。
  • @aladd04 编码转换任意文本 格式化字节;你没有格式化的字节 - 你有任意字节。为此,您需要 base-n: base-n 转换任意字节 格式化文本
  • 啊,我明白了。这是有道理的。我很困惑。感谢您的信息!
猜你喜欢
  • 1970-01-01
  • 2016-02-18
  • 1970-01-01
  • 2014-12-25
  • 2011-07-13
  • 1970-01-01
  • 2015-04-10
  • 1970-01-01
  • 2018-12-15
相关资源
最近更新 更多