在crypto node library中有许多标记为update
的功能(example,example,example)。该文档很好,但是每个文档都只是通过“更新...”来解释update
的功能
例如:
hmac.update(data [,inputEncoding])
使用给定的数据更新Hmac内容,其编码为 在inputEncoding中指定,可以是'utf8','ascii'或'latin1'。如果 没有提供编码,并且数据是字符串,是 强制执行“ utf8”。如果数据是Buffer,TypedArray或DataView,则 inputEncoding被忽略。
我的问题是“请说明在这种情况下进行更新的意思”
答案 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模式的实现。此模式对update
和final
都有特殊要求。 update
可能仅被调用一次,而final
必须精确地调用一次。 CCM模式适用于数据包格式,该格式无法使用流进行更新,因此多次更新将破坏CCM(这包括身份验证标签计算前的消息大小)。最后,需要调用final
来创建/验证身份验证标签。
注意:
通常,在创建过程中或使用显式初始化方法来设置内部初始状态。显然,NodeJS选择了在对象创建期间进行初始化。
哈希算法还需要对纯文本进行缓冲,因为它们只能对纯文本块进行操作(准确地说,SHA-256为512字节,SHA-512为1024字节)。但是,这对于哈希函数的用户是透明的,因为它们不生成任何中间输出。 HMAC仅基于哈希函数和某些XOR,当然具有相同的要求,因此需要缓冲。
有时还需要update
功能,因为并非所有消息都同时或在同一阵列中可用。例如,TLS对所有发送/接收的握手消息进行身份验证,因此只要下一条消息可用,就会调用update
。
其他不处理大消息的算法通常不包含更新方法。例如,PBKDF2不使用update
,因为没有理由流密码或盐。只需使用单个变量即可。