ssri

中文文档
14.0.0发布于 2026/05/09ISCCommonJS构建来源已验证近 30 天下载 1.6亿

标准子资源完整性库 - 根据SRI光谱剖析,序列化,生成,并验证完整性元数据.

中文使用文档
文档目录6 节
  1. 安装
  2. 目录
  3. 示例
  4. 特征
  5. 捐款
  6. API 密码

丝丽 npm version license Travis AppVeyor Coverage Status

ssri,标准次资源 完整性,是用于解析,操纵,串行化的节点Js工具, 生成并验证 次级资源 诚信 胡说八道.

安装

$ npm install --save ssri

目录

示例

const ssri = require('ssri')

const integrity = 'sha512-9KhgCRIx/AmzC8xqYJTZRrnO8OW2Pxyl2DIMZSBOr0oDvtEFyht3xpp71j/r/pAe1DM+JI/A+line3jUBgzQ7A==?foo'

// Parsing and serializing
const parsed = ssri.parse(integrity)
ssri.stringify(parsed) // === integrity (works on non-Integrity objects)
parsed.toString() // === integrity

// Async stream functions
ssri.checkStream(fs.createReadStream('./my-file'), integrity).then(...)
ssri.fromStream(fs.createReadStream('./my-file')).then(sri => {
  sri.toString() === integrity
})
fs.createReadStream('./my-file').pipe(ssri.createCheckerStream(sri))

// Sync data functions
ssri.fromData(fs.readFileSync('./my-file')) // === parsed
ssri.checkData(fs.readFileSync('./my-file'), integrity) // => 'sha512'

特征

  • 解析和字符串 SRI 字符串 .
  • 从原始数据或流中生成SRI字符串.
  • 严格标准合规.
  • ?foo 元数据选项支持.
  • 同一算法的多个条目.
  • 基于对象的完整散列操纵.
  • 足迹小:没有依附关系,执行简洁.
  • 全面测试覆盖.
  • 定制算法取取取器.

捐款

斯里团队热情欢迎捐款和项目参与!! 如果你想出力,你们可以做很多事! 这个 贡献者 指南 拥有所有你需要的信息 从所有从 报告错误以贡献整个新特性。 请不要犹豫 如果你愿意,跳进去,甚至问我们问题 如果事情不明.

API 密码

> ssri.parse(sri, [opts]) -> Integrity

参数 sri 变成 Integrity 数据结构. sri 也可以是一个正直 字符串, 一个 Hash- 喜欢 digest 财务报告和审定财务报表 algorithm 字段和一个可选 options 字段,或一个 Integrity- 喜欢的东西。 由此产生的对象将是 Integrity 具有此形状的示例:

{
  'sha1': [{algorithm: 'sha1', digest: 'deadbeef', options: []}],
  'sha512': [
    {algorithm: 'sha512', digest: 'c0ffee', options: []},
    {algorithm: 'sha512', digest: 'bad1dea', options: ['foo']}
  ],
}

若为 opts.single 是事实,一个 Hash 对象将返回。 这是,一个 看起来像单对象 {algorithm, digest, options},相对于 具有多个这样的较大对象.

若为 opts.strict 是真实的,产生的对象将被过滤到这样 它严格遵循子资源完整性规格,丢弃任何条目 带有任何无效组件。 这也意味着一套有限的算法 将被使用 -- 光谱限制它们到 sha256, (中文(简体) ), sha384,以及 sha512。 。 。 .

如果完整性字符串用于 浏览器,或者在需要严格遵守光谱的其他情况下.

示例
ssri.parse('sha512-9KhgCRIx/AmzC8xqYJTZRrnO8OW2Pxyl2DIMZSBOr0oDvtEFyht3xpp71j/r/pAe1DM+JI/A+line3jUBgzQ7A==?foo') // -> Integrity object

> ssri.stringify(sri, [opts]) -> String

此函数与 Integrity#toString(), (中文(简体) ), 除非它可以用来 任意 对象 parse 能处理 - that 一个字符串,一个 Hash- 喜欢,或者一个 Integrity- 喜欢.

这个 opts.sep 选项定义在加入多个条目时使用的字符串 一起来 要符合规格,这个 必须 白相间 默认是 单间空间( e)' ') (中文(简体) ).

若为 opts.strict ,完整性字符串将使用严格的 解析规则。 见 ssri.parse。 。 。 .

示例
// Useful for cleaning up input SRI strings:
ssri.stringify('\n\rsha512-foo\n\t\tsha384-bar')
// -> 'sha512-foo sha384-bar'

// Hash-like: only a single entry.
ssri.stringify({
  algorithm: 'sha512',
  digest:'9KhgCRIx/AmzC8xqYJTZRrnO8OW2Pxyl2DIMZSBOr0oDvtEFyht3xpp71j/r/pAe1DM+JI/A+line3jUBgzQ7A==',
  options: ['foo']
})
// ->
// 'sha512-9KhgCRIx/AmzC8xqYJTZRrnO8OW2Pxyl2DIMZSBOr0oDvtEFyht3xpp71j/r/pAe1DM+JI/A+line3jUBgzQ7A==?foo'

// Integrity-like: full multi-entry syntax. Similar to output of `ssri.parse`
ssri.stringify({
  'sha512': [
    {
      algorithm: 'sha512',
      digest:'9KhgCRIx/AmzC8xqYJTZRrnO8OW2Pxyl2DIMZSBOr0oDvtEFyht3xpp71j/r/pAe1DM+JI/A+line3jUBgzQ7A==',
      options: ['foo']
    }
  ]
})
// ->
// 'sha512-9KhgCRIx/AmzC8xqYJTZRrnO8OW2Pxyl2DIMZSBOr0oDvtEFyht3xpp71j/r/pAe1DM+JI/A+line3jUBgzQ7A==?foo'

> Integrity#concat(otherIntegrity, [opts]) -> Integrity

缩写 a Integrity 与另一个完整性类似或完整性的对象 绳子.

这在功能上相当于调和两者的字符串格式 廉洁的论据,以及调用 ssri.parse 在新字符串上.

若为 opts.strict 是真的,新来的 Integrity 将使用严格的 解析规则。 见 ssri.parse。 。 。 .

示例
// This will combine the integrity checks for two different versions of
// your index.js file so you can use a single integrity string and serve
// either of these to clients, from a single `<script>` tag.
const desktopIntegrity = ssri.fromData(fs.readFileSync('./index.desktop.js'))
const mobileIntegrity = ssri.fromData(fs.readFileSync('./index.mobile.js'))

// Note that browsers (and ssri) will succeed as long as ONE of the entries
// for the *prioritized* algorithm succeeds. That is, in order for this fallback
// to work, both desktop and mobile *must* use the same `algorithm` values.
desktopIntegrity.concat(mobileIntegrity)

> Integrity#merge(otherIntegrity, [opts])

安全合并另一个完整性 类似或完整性字符串 Integrity 对象.

如果其他完整性值有与当前相通的任何算法 对象,然后散列文摘必须匹配,否则就会出错.

任何新的散列都会被添加到当前对象的设定中.

当一个完整性值可能升级为更强时,这样做是有用的 算法,您希望防止不慎抑制完整性错误 覆盖预期的完整性值 .

示例
const data = fs.readFileSync('data.txt')

// integrity.txt contains 'sha1-X1UT+IIv2+UUWvM7ZNjZcNz5XG4='
// because we were young, and didn't realize sha1 would not last
const expectedIntegrity = ssri.parse(fs.readFileSync('integrity.txt', 'utf8'))
const match = ssri.checkData(data, expectedIntegrity, {
  algorithms: ['sha512', 'sha1']
})
if (!match) {
  throw new Error('data corrupted or something!')
}

// get a stronger algo!
if (match && match.algorithm !== 'sha512') {
  const updatedIntegrity = ssri.fromData(data, { algorithms: ['sha512'] })
  expectedIntegrity.merge(updatedIntegrity)
  fs.writeFileSync('integrity.txt', expectedIntegrity.toString())
  // file now contains
  // 'sha1-X1UT+IIv2+UUWvM7ZNjZcNz5XG4= sha512-yzd8ELD1piyANiWnmdnpCL5F52f10UfUdEkHywVZeqTt0ymgrxR63Qz0GB7TKPoeeZQmWCaz7T1+9vBnypkYWg=='
}

> Integrity#toString([opts]) -> String

返回一个字符串表示式 Integrity 对象。 所有散列条目 将在字符串中由 opts.sep,默认为 ' '。 。 。 .

如果你想把一个不是来自 ssri 函数, 使用情况 ssri.stringify()。 。 。 .

若为 opts.strict ,完整性字符串将使用严格的 解析规则。 见 ssri.parse。 。 。 .

示例
const integrity = 'sha512-9KhgCRIx/AmzC8xqYJTZRrnO8OW2Pxyl2DIMZSBOr0oDvtEFyht3xpp71j/r/pAe1DM+JI/A+line3jUBgzQ7A==?foo'

ssri.parse(integrity).toString() === integrity

> Integrity#toJSON() -> String

返回一个字符串表示式 Integrity 对象。 所有散列条目 将在字符串中由 ' '。 。 。 .

这是一个方便的方法,你可以通过一个 Integrity 对象直接对 JSON.stringify。 。 。 . 需要更多的信息检查出来 至 JSON () mdn 上的行为。 。 。 .

示例
const integrity = '"sha512-9KhgCRIx/AmzC8xqYJTZRrnO8OW2Pxyl2DIMZSBOr0oDvtEFyht3xpp71j/r/pAe1DM+JI/A+line3jUBgzQ7A==?foo"'

JSON.stringify(ssri.parse(integrity)) === integrity

> Integrity#match(sri, [opts]) -> Hash | false

如果 Integrity 匹配通过的参数为 sri,它可以是任何东西 parse 将接受. opts 将会是 传递到 parse 财务报告和审定财务报表 pickAlgorithm()。 。 。 .

示例
const integrity = 'sha512-9KhgCRIx/AmzC8xqYJTZRrnO8OW2Pxyl2DIMZSBOr0oDvtEFyht3xpp71j/r/pAe1DM+JI/A+line3jUBgzQ7A=='

ssri.parse(integrity).match(integrity)
// Hash {
//   digest: '9KhgCRIx/AmzC8xqYJTZRrnO8OW2Pxyl2DIMZSBOr0oDvtEFyht3xpp71j/r/pAe1DM+JI/A+line3jUBgzQ7A=='
//   algorithm: 'sha512'
// }

ssri.parse(integrity).match('sha1-deadbeef')
// false

> Integrity#pickAlgorithm([opts]) -> String

从完整性对象中可用的算法返回“最佳”算法.

若为 opts.pickAlgorithm 将会通过两个算法作为 参数。 ssri 将优先排序两个算法中的任意一个 ưμ㼯A 注意该函数可能被称为多次,并且 必须 返回所提供的两个算法中的一个。 默认,Ssri会做 用于选择给定算法中最强/最可靠的算法。 这个 可能有意将已知有弱点的算法降低优先顺序.

示例
ssri.parse('sha1-WEakDigEST sha512-yzd8ELD1piyANiWnmdnpCL5F52f10UfUdEkHywVZeqTt0ymgrxR63Qz0GB7TKPoeeZQmWCaz7T1').pickAlgorithm() // sha512

> Integrity#hexDigest() -> String

Integrity 假设是单发 Integrity 例如,或 Hash 举个例子 归还其 digest,转换为十六进制 基础64数据.

示例
ssri.parse('sha1-deadbeef').hexDigest() // '75e69d6de79f'

> ssri.fromHex(hexDigest, algorithm, [opts]) -> Integrity

创建一个 Integrity 单项对象,基于六进制格式 散货 这是帮助将已有的shasums转换为 诚信格式,大致相当于诸如:

algorithm + '-' + Buffer.from(hexDigest, 'hex').toString('base64')

opts.options 可选择通过:必须是一系列选项 将添加到所有生成的完整散列的字符串 fromData。这是SRI的宽松特征,目前没有 指定语义除是 ?- 分开了 冒险使用,和 如果您的完整性字符串是用于浏览器的话, 可能会避免 .

若为 opts.strict ,完整性对象将使用严格的 解析规则。 见 ssri.parse。 。 。 .

若为 opts.single 是真的,一个 Hash 对象将返回.

示例
ssri.fromHex('75e69d6de79f', 'sha1').toString() // 'sha1-deadbeef'

> ssri.fromData(data, [opts]) -> Integrity

创建一个 Integrity 从字符串或 Buffer 数据,计算 所有请求的散列,并在对象中添加任何指定的选项.

opts.algorithms 决定要生成散列的算法 。 全体 结果将列入一个单一的 Integrity 对象。 默认值 opts.algorithms 实值 ['sha512']。所有算法字符串必须列出散列 内 crypto.getHashes() 为主机Node.js平台.

opts.options 可选择通过:必须是一系列选项 将添加到所有生成的完整散列的字符串 fromData。这是SRI的宽松特征,目前没有 指定语义除是 ?- 分开了 冒险使用,和 如果您的完整性字符串是用于浏览器的话, 可能会避免 .

若为 opts.strict ,完整性对象将使用严格的 解析规则。 见 ssri.parse。 。 。 .

示例
const integrityObj = ssri.fromData('foobarbaz', {
  algorithms: ['sha256', 'sha384', 'sha512']
})
integrity.toString('\n')
// ->
// sha256-l981iLWj8kurw4UbNy8Lpxqdzd7UOxS50Glhv8FwfZ0=
// sha384-irnCxQ0CfQhYGlVAUdwTPC9bF3+YWLxlaDGM4xbYminxpbXEq+D+2GCEBTxcjES9
// sha512-yzd8ELD1piyANiWnmdnpCL5F52f10UfUdEkHywVZeqTt0ymgrxR63Qz0GB7TKPoeeZQmWCaz7T1+9vBnypkYWg==

> ssri.fromStream(stream, [opts]) -> Promise<Integrity>

返回通过读取数据计算出的完整性对象的许诺 给定 stream。 。 。 .

它接受两者 opts.algorithms 财务报告和审定财务报表 opts.options,现作为文件编号 部分内容 ssri.fromData。 。 。 .

此外, opts.Promise 可以输入输入“承诺”库 选择。 默认情况下,sri会使用Node的内置承诺.

若为 opts.strict ,完整性对象将使用严格的 解析规则。 见 ssri.parse。 。 。 .

示例
ssri.fromStream(fs.createReadStream('index.js'), {
  algorithms: ['sha1', 'sha512']
}).then(integrity => {
  return ssri.checkStream(fs.createReadStream('index.js'), integrity)
}) // succeeds

> ssri.create([opts]) -> <Hash>

返回 Hash 对象 update(<Buffer or string>[,enc]) 财务报告和审定财务报表 digest() 方法。 。 .

Hash 对象提供了与 密码类 Hash。 。 。 . digest() 接受任何参数并返回通过读取数据计算出来的完整性对象 请求更新.

它接受两者 opts.algorithms 财务报告和审定财务报表 opts.options,现作为文件编号 部分内容 ssri.fromData。 。 。 .

若为 opts.strict ,完整性对象将使用严格的 解析规则。 见 ssri.parse。 。 。 .

示例
const integrity = ssri.create().update('foobarbaz').digest()
integrity.toString()
// ->
// sha512-yzd8ELD1piyANiWnmdnpCL5F52f10UfUdEkHywVZeqTt0ymgrxR63Qz0GB7TKPoeeZQmWCaz7T1+9vBnypkYWg==

> ssri.checkData(data, sri, [opts]) -> Hash|false

验证 data 廉洁行为 sri 参数. data 可以是 String 或一个 Buffer,以及 sri 可以是任何子资源完整性 代表 ssri.parse 可以处理.

如果核查成功, checkData 将返回算法的名称 用于核查(真实值)。 否则它会回来的 false。 。 。 .

若为 opts.pickAlgorithm 提供时,它将被使用 Integrity#pickAlgorithm 当决定哪一个 可用的文摘可以匹配.

若为 opts.error 是真的 核查失败了, checkData 将投出 a 一个 EBADSIZE 或一个 EINTEGRITY 错误, 而不是只返回虚假 .

示例
const data = fs.readFileSync('index.js')
ssri.checkData(data, ssri.fromData(data)) // -> 'sha512'
ssri.checkData(data, 'sha256-l981iLWj8kurw4UbNy8Lpxqdzd7UOxS50Glhv8FwfZ0')
ssri.checkData(data, 'sha1-BaDDigEST') // -> false
ssri.checkData(data, 'sha1-BaDDigEST', {error: true}) // -> Error! EINTEGRITY

> ssri.checkStream(stream, sri, [opts]) -> Promise<Hash>

核实 stream 反对: sri 参数. stream 将会是 整个过程消耗殆尽. sri 可以是任何子资源完整性 代表 ssri.parse 可以处理.

checkStream {\fn华文楷体\fs16\1cHE0E0E0}将回到一个承诺... {\fn华文楷体\fs16\1cHE0E0E0}其中之一 Hash 如果核查失败 或发生错误 stream承诺会被拒绝的.

如果由于校验失败而拒绝承诺, 返回的错误会 有过 err.code 作为 EINTEGRITY。 。 。 .

若为 opts.size 将被给出,它将与流大小相匹配。 错误 与 err.code EBADSIZE 如果预期的大小被否决,则将被还原 实际大小无法匹配.

若为 opts.pickAlgorithm 提供时,它将被使用 Integrity#pickAlgorithm 当决定哪一个 可用的文摘可以匹配.

示例
const integrity = ssri.fromData(fs.readFileSync('index.js'))

ssri.checkStream(
  fs.createReadStream('index.js'),
  integrity
)
// ->
// Promise<{
//   algorithm: 'sha512',
//   digest: 'sha512-yzd8ELD1piyANiWnmdnpCL5F52f10UfUdEkHywVZeqTt0ymgrxR63Qz0GB7TKPoeeZQmWCaz7T1'
// }>

ssri.checkStream(
  fs.createReadStream('index.js'),
  'sha256-l981iLWj8kurw4UbNy8Lpxqdzd7UOxS50Glhv8FwfZ0'
) // -> Promise<Hash>

ssri.checkStream(
  fs.createReadStream('index.js'),
  'sha1-BaDDigEST'
) // -> Promise<Error<{code: 'EINTEGRITY'}>>

> integrityStream([opts]) -> IntegrityStream

回返a Transform 用于生成的数据流 并选择检查管道数据的数据完整性。 当溪流完成时 成功发射 size 财务报告和审定财务报表 integrity 活动总数 处理和计算过的字节数 Integrity 基于流的示例 数据.

若为 opts.algorithms 中,当 生成最终 Integrity 举个例子 默认是 ['sha512']。 。 。 .

若为 opts.single 被传入,一个 Hash 将返回实例.

若为 opts.integrity 它应该是一个 integrity 理解值 以 parse 以数据为对照。 若为 验证成功,完整性流将发出 verified 活动 值是一个单一的 Hash 对象是成功验证的对象。 若为 校验失败, 流将用一个 EINTEGRITY 错误代码 .

若为 opts.size 将被给出,它将与流大小相匹配。 错误 与 err.code EBADSIZE 如果预期大小 实际大小无法匹配.

若为 opts.pickAlgorithm 将会通过两个算法作为 参数。 ssri 将优先排序两个算法中的任意一个 ưμ㼯A 注意该函数可能被称为多次,并且 必须 返回所提供的两个算法中的一个。 默认,Ssri会做 用于选择给定算法中最强/最可靠的算法。 这个 可能有意将已知有弱点的算法降低优先顺序.

示例
const integrity = ssri.fromData(fs.readFileSync('index.js'))
fs.createReadStream('index.js')
.pipe(ssri.integrityStream({integrity}))

版本与发布记录

ssri 共发布 44 个版本,首次发布于 2017/03/23;过去 12 个月发布了 2 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
14.0.0latest2026/05/095 个月前
13.0.12026/02/108 个月前
13.0.02025/10/221 年前
12.0.02024/09/262 年前
11.0.02024/09/042 年前
10.0.62024/05/042 年前

关于 ssri 的常见问题

ssri 是什么?

标准子资源完整性库 - 根据SRI光谱剖析,序列化,生成,并验证完整性元数据.

如何安装 ssri?

在项目目录运行 npm install ssri,或使用 pnpm add / yarn add / bun add。

ssri 支持 TypeScript 吗?

该包的 package.json 没有声明类型入口。需要类型提示时,可以在 npm 上查找社区维护的 @types/ssri 是否存在。

ssri 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

ssri 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js ^22.22.2 || ^24.15.0 || >=26.0.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

ssri 可以商用吗?

ssri 使用 ISC 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

ssri 的下载量有多少?

根据 npm 官方下载统计,ssri 在 2026/10/05 – 2026/11/03 这 30 天内被下载 157,756,519 次,日均约 5,258,551 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

ssri 还在维护吗?

最新版本 14.0.0 发布于 2026/05/09(5 个月前);至今共发布 44 个版本,其中过去 12 个月发布了 2 个;首次发布于 2017/03/23。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。