5

当使用 md5sum linux 命令和 CryptoJS 的 MD5 方法时,我试图让 tar 文件的 md5sum 产生相同的值。

在 JavaScript 中我会这样做(在将文件放入 HTML 表单之后):

var reader = new FileReader();

reader.onloadend = function () {
     text = (reader.result);
}

reader.readAsBinaryString(document.getElementById("firmware_firmware").files[0]);

var hash = CryptoJS.MD5(text);

hash.toString();

在 Linux 中,我这样做:

md5sum name_of_file.tar

目前这两种产生不同的结果。我如何让 JavaScript 以与 Linux 上的 md5sum 相同的方式获取 tar 文件的内容以进行 MD5 处理?

对于一个简单的字符串,md5sum 和 CryptoJS 产生相同的值。

编辑:使用名为 Fred.txt 的文件,内容为“Fred”,md5sum 和 CryptoJS 都产生相同的值:c624decb46fa3d60e824389311b252f6。

在 update.tar 文件中,Linux 上的 md5sum 给了我:1f046eedb7d8279953d233e590830e4f,在 CryptoJS 上它给了我:f0c3730e5a9863cffa0ba3fadd531788

Edit2:进一步测试表明,这实际上是一个问题,因为文件大小很大,例如 7 兆字节

4

3 回答 3

11

JavaScript 中的所有字符串——甚至是“二进制字符串”——实际上都是 UTF-16 字符。“二进制字符串”是选择仅使用前 256 个代码点的字符串。由于 Latin-1 编码也恰好使用前 256 个代码点,因此您可以使用 Latin-1 将字符串转换为字节。

var hash = CryptoJS.MD5(CryptoJS.enc.Latin1.parse(text));
于 2013-12-03T23:09:48.723 回答
1

我认为这是因为文件没有完成加载,并且在文件上传 100% 之前创建了哈希。尝试将散列移动到 onloadend 事件中:

var reader = new FileReader();

reader.onloadend = function () {
     var hash = CryptoJS.MD5(reader.result);
     hash.toString();
}

reader.readAsBinaryString(document.getElementById("firmware_firmware").files[0]);
于 2013-11-28T11:15:29.720 回答
0

当您运行 bash 时,请确保您没有向散列函数发送换行符。如果使用echo,请添加-n参数:

$ echo -n abc | md5sum
900150983cd24fb0d6963f7d28e17f72  -

与:

$ echo abc | md5sum
0bee89b07a248e27c83fc3d5951213c1  -
于 2018-06-05T13:33:14.290 回答