在 java 中创建 HMac 时 doFinal 函数做了什么

What does doFinal function do in creation of HMac in java

我在java中有一个hmac生成方法,定义如下:-

String encStr = "POST\n" + timestamp + "\n" + message;
    Mac sha256_HMAC = Mac.getInstance("HmacSHA1");
    SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacSHA1");
    sha256_HMAC.init(secret_key);

    String hash = Base64.getEncoder().encodeToString(sha256_HMAC.doFinal(encStr.getBytes()));

    return hash;

其中 secret 和 function name 是我的私钥和名称。 我只想知道 doFinal 函数的作用,因为 oracle 文档说它正在重置密钥,但它们也有明确的重置方法

想想当你的数据量很大的时候,你会做:

sha256_HMAC.init()
while(read more data into buffer) {
    sha256_HMAC.upadte(buffer)
}
result = sha256_HMAC.doFinal()

所以,doFinal(buffer) 做的是:

do `update(buffer)` 
calculate the cryptography result
reset the HmacSHA1 instance
return the cryptography result

doFinal表示这是计算结果的最后一步,没有更多数据了。

来自 Java 文档 (https://docs.oracle.com/javase/8/docs/api/javax/crypto/Mac.html):

  • byte[] doFinal() 完成 MAC 操作。

  • byte[] doFinal(byte[] input) 处理给定的字节数组并完成 MAC 操作。