我们的 IT/安全部门委托我验证从 npm 下载的内容的完整性。我是一名程序员,虽然我大致了解执行 sha 校验和的含义,但我无法弄清楚如何在我的 NPM 软件包上执行此操作。
我成功地对从浏览器下载的单个文件执行了 npm 以外的其他检查。NPM 安装在“package-lock.json”中带有“完整性”值,但我不确定如何使用该值。例如,当尝试对 D3 库执行此检查时,该库的“完整性”值为“sha512-4PL5hHaHwX4m7Zr1UapXW23apo6pexCgdetdJ5kTmADpG/7T9Gkxw0M0tf/pjoB63ezCCm0u5UaFYy2aMt0Mcw==”,我无法重新创建该值。我尝试使用 7zip 创建包文件夹的 tarball,甚至尝试直接从“已解析”值“https://registry.npmjs.org/d3/-/d3-5.16.0.tgz”下载“.tgz”文件,但仍然没有产生正确的校验和。
我使用了以下两个命令,它们都给出了相同的结果。(e0f2f9847687c17e26ed9af551aa575b6ddaa68ea97b10a075eb5d2799139800e91bfed3f46931c34334b5ffe98e807addecc20a6d2ee54685632d9a32dd0c73)
Get-FileHash -Path C:\Path\to\d3-5.16.0.tgz -Algorithm SHA512
certutil -hashfile C:\Path\to\d3-5.16.0.tgz sha512
如果有人能告诉我我做错什么或遗漏了什么,我将非常感激。
答案1
验证取决于每个文件的类型https://docs.npmjs.com/cli/v6/configuring-npm/package-lock-json#integrity
正直
这是此资源的标准子资源完整性。
对于捆绑的依赖项,无论来源如何,这都不包括在内。
对于注册表源,这是注册表提供的完整性,或者如果没有提供,则为 shasum 中的 SHA1。
对于 git 源,这是我们从中克隆的特定提交哈希。
对于远程 tarball 源,这是基于文件 SHA512 的完整性。
对于本地 tarball 源:这是基于文件 SHA512 的完整性字段。
要计算 tgz,https://w3c.github.io/webappsec-subresource-integrity/提供了一个您可以调整的示例 - 因此您可以像这样检查它:
curl -LO <someurl>/some-package-1.0.0.tgz
cat ./some-package-1.0.0.tgz | openssl dgst -sha512 -binary | openssl base64 -A