1

Using the following code I always get the same hash regardless of the input. Any ideas why that might be?

    private static SHA256 sha256;
    internal static byte[] HashForCDCR(this string value)
    {
        byte[] hash;
        using (var myStream = new System.IO.MemoryStream())
        {
            using (var sw = new System.IO.StreamWriter(myStream))
            {
                sw.Write(value);
                hash = sha256.ComputeHash(myStream);
            }
        }

        return hash;
    }
4

3 回答 3

4

您正在计算流的空部分的哈希(紧跟在您编写的内容之后的那个sw.Write),所以它总是相同的。

廉价修复:sw.Flush();myStream.Position = 0;. 更好的解决方法是完成写入并基于原始流创建新的只读流进行加密:

using (var myStream = new System.IO.MemoryStream())
{
    using (var sw = new System.IO.StreamWriter(myStream))
    {
        sw.Write(value);
    }
    using (var readonlyStream = new MemoryStream(myStream.ToArray(), writable:false)
    {
       hash = sha256.ComputeHash(readonlyStream);
    }
}
于 2013-08-06T18:22:03.300 回答
1

您可能需要刷新您的流。为了获得最佳性能 StreamWriter 不会立即写入流。它等待其内部缓冲区填满。刷新写入器会立即刷新内部缓冲区的内容以添加下划线流。

     sw.Write(value);
     sw.Flush();
     myStream.Position = 0;
     hash = sha256.ComputeHash(myStream);
于 2013-08-06T18:17:08.203 回答
0

我可能会使用 Alexei Levenkov 称之为“廉价修复”的解决方案。但是,我确实遇到了另一种使它起作用的方法,我将把它发布给未来的读者:

var encoding = new System.Text.UTF8Encoding();
var bytes = encoding.GetBytes(value);
var hash = sha256.ComputeHash(bytes);
return hash;

雅各布

于 2013-08-06T22:30:33.827 回答