如何手动确认 package-lock.json 文件中的完整性字段?

How to manually confirm integrity field in package-lock.json file?

我可以 运行 手动生成(或确认)package-lock.json 文件中包含的 integrity 字段的哪些命令?

这是一个使用 SHA1 的例子:

"uglify-js": {
  "version": "2.8.29",
  "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
  "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",

另一个使用 SHA512:

"uri-js": {
  "version": "4.2.2",
  "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
  "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",

我的大胆猜测是 运行 对 tgz 文件指定的哈希值,然后对其进行 base64 编码,但事实并非如此。例如:

$ sha1sum.exe uglify-js-2.8.29.tgz
29c5733148057bb4e1f75df35b7a9cb72e6a59dd *uglify-js-2.8.29.tgz

$ sha1sum.exe uglify-js-2.8.29.tgz | cut -d " " -f1
29c5733148057bb4e1f75df35b7a9cb72e6a59dd

$ sha1sum.exe uglify-js-2.8.29.tgz | cut -d " " -f1 | base64
MjljNTczMzE0ODA1N2JiNGUxZjc1ZGYzNWI3YTljYjcyZTZhNTlkZAo=

这显然不等于:

KcVzMUgFe7Th913zW3qcty5qWd0=

看起来这个 NPM 包字段是基于 Subresource Integrity 计算的。

根据链接页面,您的示例的正确命令可能是:

$ shasum -b -a 1 /path/to/uglify-js-2.8.29.tgz | awk '{ print  }' | xxd -r -p | base64
KcVzMUgFe7Th913zW3qcty5qWd0=

其中 1 是使用的密码 (SHA1)。

对于 SHA512,命令有点不同(注意 512 值用于 -a 开关):

$ shasum -b -a 512 /path/to/uri-js-4.2.2.tgz | awk '{ print  }' | xxd -r -p | base64
KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==