WEBKT

HMAC 实战:Python、Java、Go 语言实现 HMAC-SHA256 和 HMAC-SHA512 代码示例及详解

12 0 0 0

HMAC 实战:Python、Java、Go 语言实现 HMAC-SHA256 和 HMAC-SHA512 代码示例及详解

为什么需要 HMAC?

HMAC 的工作原理

Python 实现 HMAC-SHA256 和 HMAC-SHA512

Java 实现 HMAC-SHA256 和 HMAC-SHA512

Go 实现 HMAC-SHA256 和 HMAC-SHA512

总结与最佳实践

进阶应用:HMAC 的实际应用场景

结语

HMAC 实战:Python、Java、Go 语言实现 HMAC-SHA256 和 HMAC-SHA512 代码示例及详解

嘿,老铁们,今天咱们来聊聊一个在安全领域里贼好用的东西——HMAC(Hash-based Message Authentication Code,基于哈希的消息认证码)。 简单来说,HMAC 就是用一个密钥和一个哈希函数,来对消息进行签名,保证消息的完整性和真实性。 听起来有点儿玄乎? 别怕,咱们用 Python、Java 和 Go 这三种常用的编程语言,手把手教你搞定 HMAC-SHA256 和 HMAC-SHA512 的实现,让你对这玩意儿有个更直观的认识。 走起!

为什么需要 HMAC?

在网络世界里,数据传输就像快递小哥送包裹一样,你得确保:

  1. 包裹是完整无损的: 消息在传输过程中没有被篡改。
  2. 包裹是“本人”发的: 消息确实是由你信任的人或系统发出的,而不是伪造的。

传统的哈希函数(比如 SHA-256)可以保证数据的完整性,但无法保证数据的来源。 也就是说,你无法确定这个哈希值是“张三”生成的,还是“李四”伪造的。 HMAC 就完美地解决了这个问题。 它通过引入密钥,只有拥有正确密钥的人才能生成正确的 HMAC 值,从而实现了身份验证和数据完整性的双重保障。

HMAC 的工作原理

HMAC 的核心思想是将密钥和消息混合,然后使用哈希函数进行计算。 具体来说,HMAC 的计算过程可以分为以下几个步骤(以 SHA-256 为例):

  1. 密钥处理
    • 如果密钥长度大于哈希函数的块大小(例如 SHA-256 的块大小是 64 字节),则使用哈希函数对密钥进行哈希,生成一个长度为块大小的新密钥。
    • 如果密钥长度小于块大小,则在密钥的右侧填充零,使其长度等于块大小。
  2. 内部哈希
    • 将处理后的密钥与一个叫做 ipad 的值进行异或(XOR)运算。 ipad 是一个常量,由 0x36 重复块大小次构成。
    • 将异或后的结果与消息连接起来。
    • 对连接后的数据进行哈希计算。
  3. 外部哈希
    • 将处理后的密钥与一个叫做 opad 的值进行异或运算。 opad 是一个常量,由 0x5c 重复块大小次构成。
    • 将异或后的结果与上一步的哈希值连接起来。
    • 对连接后的数据进行哈希计算,得到最终的 HMAC 值。

用公式表示就是:

HMAC(K, m) = H((K ⊕ opad) || H((K ⊕ ipad) || m))

其中:

  • K 是密钥
  • m 是消息
  • H 是哈希函数(例如 SHA-256)
  • || 表示连接
  • 表示异或
  • ipadopad 是内部和外部填充值

Python 实现 HMAC-SHA256 和 HMAC-SHA512

Python 提供了强大的 hashlib 模块,可以方便地进行 HMAC 计算。 下面是使用 Python 实现 HMAC-SHA256 和 HMAC-SHA512 的代码示例:

import hashlib
import hmac
# 密钥
key = b'ThisIsASecretKey'
# 消息
message = b'This is a secret message'
# HMAC-SHA256
hmac_sha256 = hmac.new(key, message, hashlib.sha256).hexdigest()
print(f'HMAC-SHA256: {hmac_sha256}')
# HMAC-SHA512
hmac_sha512 = hmac.new(key, message, hashlib.sha512).hexdigest()
print(f'HMAC-SHA512: {hmac_sha512}')

代码解释:

  1. 导入模块: 导入 hashlibhmac 模块。
  2. 定义密钥和消息: 定义用于 HMAC 计算的密钥和消息。 密钥和消息都需要是字节串(bytes)。
  3. HMAC-SHA256 计算
    • 使用 hmac.new() 函数创建一个 HMAC 对象。
    • 第一个参数是密钥。
    • 第二个参数是消息。
    • 第三个参数是哈希函数(hashlib.sha256)。
    • 调用 .hexdigest() 方法获取 HMAC 值的十六进制表示。
  4. HMAC-SHA512 计算: 类似 HMAC-SHA256,只需将哈希函数改为 hashlib.sha512

Java 实现 HMAC-SHA256 和 HMAC-SHA512

Java 提供了 javax.crypto 包,可以进行 HMAC 计算。 下面是使用 Java 实现 HMAC-SHA256 和 HMAC-SHA512 的代码示例:

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
public class HmacExample {
public static void main(String[] args) throws Exception {
// 密钥
String key = "ThisIsASecretKey";
// 消息
String message = "This is a secret message";
// HMAC-SHA256
String hmacSha256 = calculateHMAC(message, key, "HmacSHA256");
System.out.println("HMAC-SHA256: " + hmacSha256);
// HMAC-SHA512
String hmacSha512 = calculateHMAC(message, key, "HmacSHA512");
System.out.println("HMAC-SHA512: " + hmacSha512);
}
public static String calculateHMAC(String message, String key, String algorithm) throws Exception {
Mac mac = Mac.getInstance(algorithm);
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), algorithm);
mac.init(secretKeySpec);
byte[] hmacBytes = mac.doFinal(message.getBytes(StandardCharsets.UTF_8));
// 将字节数组转换为 Base64 编码的字符串
return Base64.getEncoder().encodeToString(hmacBytes);
}
}

代码解释:

  1. 导入包: 导入 javax.crypto 包中的相关类。
  2. 定义密钥和消息: 定义用于 HMAC 计算的密钥和消息。 密钥和消息都是字符串。
  3. calculateHMAC 方法
    • 接收消息、密钥和算法名称作为参数。
    • 使用 Mac.getInstance() 方法获取一个 HMAC 对象,参数是算法名称(例如 "HmacSHA256")。
    • 使用 SecretKeySpec 创建一个密钥规范,将密钥转换为字节数组,并指定算法名称。
    • 使用 mac.init() 方法初始化 HMAC 对象,传入密钥规范。
    • 使用 mac.doFinal() 方法计算 HMAC 值,传入消息的字节数组。
    • 将 HMAC 值的字节数组转换为 Base64 编码的字符串,以便于显示和传输。
  4. HMAC-SHA256 和 HMAC-SHA512 计算
    • 调用 calculateHMAC 方法,传入消息、密钥和相应的算法名称。
    • 打印 HMAC 值的 Base64 编码字符串。

Go 实现 HMAC-SHA256 和 HMAC-SHA512

Go 语言的 crypto/hmaccrypto/sha256crypto/sha512 包提供了 HMAC 的实现。 下面是使用 Go 实现 HMAC-SHA256 和 HMAC-SHA512 的代码示例:

package main
import (
"crypto/hmac"
"crypto/sha256"
"crypto/sha512"
"encoding/hex"
"fmt"
)
func main() {
// 密钥
key := []byte("ThisIsASecretKey")
// 消息
message := []byte("This is a secret message")
// HMAC-SHA256
hmacSha256 := hmacSha256(key, message)
fmt.Printf("HMAC-SHA256: %s\n", hmacSha256)
// HMAC-SHA512
hmacSha512 := hmacSha512(key, message)
fmt.Printf("HMAC-SHA512: %s\n", hmacSha512)
}
func hmacSha256(key, message []byte) string {
h := hmac.New(sha256.New, key)
h.Write(message)
return hex.EncodeToString(h.Sum(nil))
}
func hmacSha512(key, message []byte) string {
h := hmac.New(sha512.New, key)
h.Write(message)
return hex.EncodeToString(h.Sum(nil))
}

代码解释:

  1. 导入包: 导入 crypto/hmaccrypto/sha256crypto/sha512encoding/hexfmt 包。
  2. 定义密钥和消息: 定义用于 HMAC 计算的密钥和消息,它们都是字节数组。
  3. hmacSha256 函数
    • 接收密钥和消息作为参数。
    • 使用 hmac.New() 函数创建一个 HMAC 对象,第一个参数是哈希函数(sha256.New),第二个参数是密钥。
    • 使用 h.Write() 方法将消息写入 HMAC 对象。
    • 使用 h.Sum(nil) 方法计算 HMAC 值。
    • 使用 hex.EncodeToString() 方法将 HMAC 值的字节数组转换为十六进制字符串。
  4. hmacSha512 函数: 类似 hmacSha256,只需将哈希函数改为 sha512.New
  5. HMAC-SHA256 和 HMAC-SHA512 计算
    • 调用相应的函数计算 HMAC 值。
    • 打印 HMAC 值的十六进制字符串。

总结与最佳实践

通过上面的例子,相信你已经对 HMAC 的实现有了清晰的认识。 总结一下,使用 HMAC 时需要注意以下几点:

  • 密钥的安全性: 密钥是 HMAC 的核心,必须妥善保管,避免泄露。 建议使用安全的密钥生成和存储方法。
  • 密钥长度: 密钥的长度会影响 HMAC 的安全性。 通常,密钥的长度应该与哈希函数的输出长度相当。 例如,对于 SHA-256,密钥长度最好是 256 位(32 字节);对于 SHA-512,密钥长度最好是 512 位(64 字节)。
  • 选择合适的哈希函数: 根据安全需求选择合适的哈希函数。 SHA-256 和 SHA-512 都是比较安全的哈希函数。
  • 避免时间攻击: 在验证 HMAC 值时,要使用恒定时间比较,以避免时间攻击。 也就是说,比较 HMAC 值时,即使前几个字节不匹配,也要继续比较所有字节,而不是提前返回。
  • 使用 Base64 或十六进制编码: HMAC 值的输出通常是字节数组,为了方便传输和存储,可以使用 Base64 或十六进制编码进行转换。

进阶应用:HMAC 的实际应用场景

HMAC 在实际应用中非常广泛,以下列举几个常见的应用场景:

  1. 消息认证: 验证消息的完整性和来源,防止消息被篡改或伪造。 例如,在 API 接口中,可以使用 HMAC 来验证请求的合法性。
  2. 密码存储: 存储用户密码时,可以使用 HMAC 对密码进行哈希,然后存储哈希值。 这样即使数据库被泄露,攻击者也无法直接获取用户的密码。
  3. 密钥派生: 从一个主密钥派生出多个子密钥,用于不同的目的。 例如,可以使用 HMAC 生成多个用于加密、解密、认证等操作的密钥。
  4. 数据完整性校验: 在文件传输或存储过程中,可以使用 HMAC 来校验数据的完整性。 例如,在下载文件时,可以提供文件的 HMAC 值,用户下载后可以使用相同的密钥和 HMAC 算法计算文件的 HMAC 值,并与提供的 HMAC 值进行比较,以确保文件没有被篡改。
  5. 身份验证: 验证用户的身份。 例如,在 Web 应用中,可以使用 HMAC 来生成会话令牌,用于验证用户的身份。

结语

好了,今天的 HMAC 实战就到这里了。 希望这篇文章能帮助你理解 HMAC 的原理和实现,并在实际项目中灵活运用。 记住,安全无小事,掌握 HMAC 这样的安全技术,可以让你在构建安全可靠的系统时更加得心应手。 如果你觉得这篇文章对你有帮助,别忘了点个赞,分享给你的小伙伴们! 咱们下次再见!

码仔快跑 HMAC安全加密PythonJavaGo

评论点评

打赏赞助
sponsor

感谢您的支持让我们更好的前行

分享

QRcode

https://www.webkt.com/article/8583