我正在写从创建JPG文件哈希一个C#程序。如果我在一个字节数组传递给我的SHA512对象,然后我得到预期的行为,但是,如果我通过在内存流两个文件总是返回相同的值。

实施例1:

        SHA512 mySHA512 = SHA512.Create();

        Image img1 = Image.FromFile(@"d:\img1.jpg");
        Image img2 = Image.FromFile(@"d:\img2.jpg");
        MemoryStream ms1 = new MemoryStream();
        MemoryStream ms2 = new MemoryStream();

        img1.Save(ms1, ImageFormat.Jpeg);
        byte[] buf1 = ms1.GetBuffer();
        byte[] hash1 = mySHA512.ComputeHash(buf1);

        img2.Save(ms2, ImageFormat.Jpeg);
        byte[] buf2 = ms2.GetBuffer();
        byte[] hash2 = mySHA512.ComputeHash(buf2);

        if (Convert.ToBase64String(hash1) == Convert.ToBase64String(hash2))
            MessageBox.Show("Hashed the same");
        else
            MessageBox.Show("Different hashes");

这产生“不同散列”。但ComputeHash方法的重载之一,接受一个流对象,我宁愿使用。当我做:

        SHA512 mySHA512 = SHA512.Create();

        Image img1 = Image.FromFile(@"d:\img1.jpg");
        Image img2 = Image.FromFile(@"d:\img2.jpg");
        MemoryStream ms1 = new MemoryStream();
        MemoryStream ms2 = new MemoryStream();

        img1.Save(ms1, ImageFormat.Jpeg);
        byte[] hash1 = mySHA512.ComputeHash(ms1);

        img2.Save(ms2, ImageFormat.Jpeg);
        byte[] hash2 = mySHA512.ComputeHash(ms2);

        if (Convert.ToBase64String(hash1) == Convert.ToBase64String(hash2))
            MessageBox.Show("Hashed the same");
        else
            MessageBox.Show("Different hashes");

产生 “散列相同的”。

这是怎么回事就在这里,我很想念?

有帮助吗?

解决方案

你不倒带你MemoryStreams,所以散列从字节的空序列进行计算。使用

ms1.Position = 0;
ms2.Position = 0;

后调用Save

一个进一步的注意:不要以这种方式使用GetBuffer。使用ToArray这将给你一个字节数组大小相同流的长度 - GetBuffer返回原始缓冲区将(通常)有一些填充,你不希望意外地使用。您可以使用GetBuffer如果您然后确保你只用它的相关部分,当然 - 这避免了创建数据的新副本

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top