在加密节点库中更新意味着什么?

时间:2018-07-30 15:21:33

标签: node.js cryptography hmac cryptojs

crypto node library中有许多标记为update的功能(exampleexampleexample)。该文档很好,但是每个文档都只是通过“更新...”来解释update的功能

例如:

  

hmac.update(data [,inputEncoding])

     

使用给定的数据更新Hmac内容,其编码为   在inputEncoding中指定,可以是'utf8','ascii'或'latin1'。如果   没有提供编码,并且数据是字符串,是   强制执行“ utf8”。如果数据是Buffer,TypedArray或DataView,则   inputEncoding被忽略。

我的问题是“请说明在这种情况下进行更新的意思”

1 个答案:

答案 0 :(得分:1)

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

对于HMAC,它在o_key_pad和散列的i_key_pad上执行最终的散列,当然还对消息执行。 final方法也可以被不同地调用;例如HMAC,它被称为digest以计算最终摘要,即HMAC计算的输出。

创建更新方法是为了允许使用多个更新大型邮件。必须使用final方法,这样算法才能知道已到达消息末尾并可以执行最终操作。


签名生成和HMAC计算具有完全相同的目的。一种是使用对称密钥,另一种是使用非对称密钥对。但是通常,签名生成/验证的工作原理几乎与HMAC生成/验证的工作原理相同。


如果使用加密,则更新也可能返回密文或明文输出。如果确实如此,则取决于算法和算法实现,返回什么以及何时返回。例如,如果您调用CBC模式,那么在进行任何块加密/解密之前,至少需要对
明文/密文块进行缓冲。但是原则上,计数器模式可以直接返回特定字节的密文。这是流密码的 online 属性。但是,该实现还可以决定缓冲明文/密文,直到有完整的块可用为止。

对于NodeJS,还有CCM模式的实现。此模式对updatefinal都有特殊要求。 update可能仅被调用一次,而final 必须精确地调用一次。 CCM模式适用于数据包格式,该格式无法使用流进行更新,因此多次更新将破坏CCM(这包括身份验证标签计算前的消息大小)。最后,需要调用final来创建/验证身份验证标签。


注意:

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

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

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

  • 其他不处理大消息的算法通常不包含更新方法。例如,PBKDF2不使用update,因为没有理由流密码或盐。只需使用单个变量即可。