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

TTT*_*TTT 9 npm npm-install 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=",
Run Code Online (Sandbox Code Playgroud)

另一个使用 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==",
Run Code Online (Sandbox Code Playgroud)

我的疯狂猜测是针对 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=
Run Code Online (Sandbox Code Playgroud)

这显然不等于:

KcVzMUgFe7Th913zW3qcty5qWd0=
Run Code Online (Sandbox Code Playgroud)

小智 13

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

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

$ shasum -b -a 1 /path/to/uglify-js-2.8.29.tgz | awk '{ print $1 }' | xxd -r -p | base64
KcVzMUgFe7Th913zW3qcty5qWd0=
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 完美的。`xxd` 是缺失的部分! (2认同)