微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

对于 txt 以外的文件,MD5 校验和计算不正确?

如何解决对于 txt 以外的文件,MD5 校验和计算不正确?

我在上传之前使用 crypto-js 来计算我的文件MD5 校验和,下面是我的代码

select t1.*
from table1 t1 
order by (select t2.name_sort_order
          from table2 t2
          where t2.filterval = t.name and t2.name_sort_order is not null
         ),(select t2.job_sort_order
          from table2 t2
          where t2.filterval = t.job and t2.job_sort_order is not null
         );

以上代码仅适用于文本文件,但在使用非文本文件文件图像、视频等时,校验和为计算错误

感谢任何帮助/输入。 谢谢!

解决方法

只需将 .then((res) => res.blob()) 的结果直接输入 MD5 函数即可。

编码为 text() 可能是有损的(和/或使用替换字符),并且 Latin1 也没有涵盖所有可能的字节值 - 至少正式如此。也不需要先转换为文本然后再转换回二进制。

需要转换为 CryptoJS 可以接受的二进制表示 - 如实现 in the other answer。然而,这需要是二进制到二进制的转换,而不是二进制 -> 文本 -> 二进制转换。

,

Response.text() 读取响应流并使用 UTF-8 编码将其转换为字符串。不符合 UTF-8 的任意二进制数据将在此过程中被破坏(例如图像、视频等),s。还有另一个答案。
这可以通过使用 Response.arrayBuffer() 来防止,它只是将未更改的数据存储在 ArrayBuffer 中。
由于 CryptoJS 在内部使用 WordArray,因此需要将 ArrayBuffer 进一步转换为 WordArray

以下修复适用于我的机器:

(async () => {
            
    const getMd5 = async(fileObject) => {
        let md5 = "";
        try {
            const fileObjectUrl = URL.createObjectURL(blob);
            const blobText = await fetch(fileObjectUrl)
                .then((res) => res.blob())
                .then((res) => new Response(res).arrayBuffer());                    // Convert to ArrayBuffer       
            const hash = CryptoJS.MD5(CryptoJS.lib.WordArray.create(blobText)); // Import as WordArray
            md5 = hash.toString(CryptoJS.enc.Hex);
        } catch (err) {
            console.log("Error occured getMd5:",err);
        }
        return md5;
    };
        
    const blob = new Blob([new Uint8Array([0x01,0x02,0x03,0x7f,0x80,0x81,0xfd,0xfe,0xff])]);
    console.log(await(getMd5(blob)));
        
})();
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>

为简单起见,我没有使用文件对象进行测试,而是使用不符合 UTF8 标准的数据的 blob 对象。 生成的哈希是正确的,可以在线验证,例如here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。