首页 > 解决方案 > 如何手动确认 package-lock.json 文件中的完整性字段?

问题描述

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

以下是 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=

标签: npmnpm-installpackage-lock.json

解决方案


看起来这个 NPM 包字段是基于子资源完整性计算的。

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

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

1使用的密码在哪里(SHA1)。

对于 SHA512,命令有点不同(注意512用于-aswitch 的值):

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

推荐阅读