【问题标题】:Getting md5sum of a file through Crypto.js通过 Crypto.js 获取文件的 md5sum
【发布时间】:2013-11-28 10:37:08
【问题描述】:

当使用 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 兆字节

【问题讨论】:

  • 你能举例说明两者的输出吗? readAsBinaryString(.....) 是否有可能对文件名而不是文件内容进行哈希处理?
  • 感谢您的回复,我已经使用带有简单字符串的简单 txt 文件对其进行了测试,在这种情况下,Linux 和 CryptoJS 上的 md5sum 会产生相同的结果。我将在输出中进行编辑。

标签: javascript linux md5 fileapi cryptojs


【解决方案1】:

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

var hash = CryptoJS.MD5(CryptoJS.enc.Latin1.parse(text));

【讨论】:

    【解决方案2】:

    我认为这是因为文件没有完成加载,并且在文件上传 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]);
    

    【讨论】:

    • 感谢您的回答,我试过了,但是没有用。不过,我很欣赏这种努力。通过进一步的测试,似乎只有几兆字节大小的文件才会出现不同的结果。所以也许沿着正确的路线,因为这是在我的本地机器上,并且是在客户端完成的,但是上传真的是一个问题吗?
    • 这也可能是由于 php.ini - max_post_sizemax_upload_size 或类似的限制。如果文件将 100% 上传,则哈希将与所有库相等。 (如果您使用的是 php)
    【解决方案3】:

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

    $ echo -n abc | md5sum
    900150983cd24fb0d6963f7d28e17f72  -
    

    对比:

    $ echo abc | md5sum
    0bee89b07a248e27c83fc3d5951213c1  -
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-19
      • 1970-01-01
      • 2011-04-10
      • 2015-09-13
      • 1970-01-01
      • 2011-03-24
      相关资源
      最近更新 更多