更新加密节点库是什么意思?

What does it mean to update in the crypto node library?

crypto node library there are many functions labeled update (example, example, example)。文档很好,但是每个文档都简单地解释了 update 和 'Updates...'

的功能

例如:

hmac.update(data[, inputEncoding])

Updates the Hmac content with the given data, the encoding of which is given in inputEncoding and can be 'utf8', 'ascii' or 'latin1'. If encoding is not provided, and the data is a string, an encoding of 'utf8' is enforced. If data is a Buffer, TypedArray, or DataView, then inputEncoding is ignored.

我的问题是“请解释在这种情况下更新是什么意思”

update 方法用给定的输入更新 HMAC 算法的内部状态。称为 update 的方法几乎普遍与某种 final 方法结合使用(有时称为 doFinal 或类似方法以避免与名为 final 的关键字发生名称冲突)。此最终方法执行内部状态的最后更新并执行任何最终操作。

在 HMAC 的情况下,它对 o_key_pad 和散列的 i_key_pad 以及消息执行最终散列。 final 方法也可以有不同的调用方式;例如,对于 HMAC,它被称为 digest 来计算最终摘要,即 HMAC 计算的输出。

创建更新方法是为了允许使用多个更新流式处理 大消息。 final 方法是必需的,以便算法知道已到达消息末尾并可以执行最终操作。


签名生成和HMAC计算的目的非常相似;一个使用对称密钥,另一个使用非对称密钥对。但通常签名生成/验证与 HMAC 生成/验证几乎相同。


如果使用加密那么更新也可能return密文或明文输出。如果确实如此,则取决于算法和算法实现 returned 的内容以及时间。例如,如果您调用 CBC 模式,那么至少需要 缓冲 ​​ 一块明文/密文才能进行任何块加密/解密。然而原则上计数器模式可以直接return特定字节的密文;这是流密码的 online 属性。然而,实现也可能决定缓冲明文/密文,直到一个完整的块可用。

对于NodeJS,也有CCM模式的实现。此模式对 updatefinal 都有特殊要求。 update 可能只调用一次,而 final 必须恰好调用一次。 CCM 模式使用无法使用流更新的 数据包格式 ,因此多次更新会破坏 CCM(包括身份验证标记计算前面的消息大小) .最后,需要调用final来创建/验证认证标签。


备注:

  • 通常 初始内部状态 是在创建期间或使用显式初始化方法设置的。 NodeJS 显然选择了在对象创建期间进行初始化。

  • 哈希算法也需要对明文进行缓冲,因为它们只能对明文块进行操作(准确地说,SHA-256 为 512 字节,SHA-512 为 1024 字节)。然而,这对散列函数的用户来说是透明的,因为它们不生成中间输出。 HMAC 仅基于散列函数和一些 XOR'ing,当然具有相同的要求,因此需要缓冲。

  • 有时还需要 update 功能,因为并非所有消息都在同一时间或在同一数组中可用。例如,TL​​S 验证所有发送/接收的握手消息,因此只要下一条消息可用,就会调用 update

  • 其他不处理大消息的算法一般不包含更新方法。例如 PBKDF2 不使用 update 因为没有理由流式传输密码或盐;它们只是使用单个变量给出的。