签名方法 Mac、MessageDigest、Signature

Java Hutool 实现非对称加密(RSA):https://www.cnblogs.com/vipsoft/p/18674812
这三种签名方式(Mac、MessageDigest、Signature)在Java加密体系中有不同的用途和适用场景,以下是它们的区别和典型使用场景:


1. MAC (Message Authentication Code) - HmacSHA256

代码示例:第一个sign方法
特点

  • 基于对称密钥(双方共享同一个密钥 requestSecret)。
  • 使用哈希算法(如SHA256)结合密钥生成消息认证码,保证消息的完整性和真实性。
  • 需要双方预先安全地共享密钥。

典型场景

  • API请求签名(如验证请求未被篡改)。
  • 服务间通信的身份验证(如微服务调用)。
  • 防止重放攻击(结合时间戳 timestamp)。

示例

String signature = sign(System.currentTimeMillis());

2. MessageDigest (哈希摘要) - MD5

代码示例:第二个getSign方法
特点

  • 单向哈希函数(如MD5、SHA-1),无密钥参与。
  • 生成固定长度的摘要,用于校验数据完整性,但无法防篡改(需配合其他机制)。
  • 代码中拼接 appSecret 是一种简易的“加盐”操作,但不如HMAC安全。

典型场景

  • 密码存储(需配合盐值,但MD5已不推荐,应使用BCrypt/PBKDF2)。
  • 文件/数据完整性校验(如下载文件校验MD5)。
  • 快速去重(如判断内容是否重复)。

注意

  • MD5易受碰撞攻击,重要场景应改用SHA-256。
  • 示例中的 Base64 编码是多余的,通常直接输出十六进制字符串。

3. Signature (数字签名) - SHA256withRSA

代码示例:第三个sign方法
特点

  • 基于非对称加密(私钥签名,公钥验证)。
  • 使用RSA/ECDSA等算法,同时实现完整性、真实性和不可否认性。
  • 计算开销较大,但无需共享密钥。

典型场景

  • 数字证书(如HTTPS的TLS握手)。
  • 软件/固件签名(验证发布者身份)。
  • 区块链交易签名。

示例

String signature = sign(privateKey, "data".getBytes());

对比总结

特性 MAC (HmacSHA256) MessageDigest (MD5/SHA-1) Signature (SHA256withRSA)
密钥类型 对称密钥 无密钥(或简单加盐) 非对称密钥(私钥签名)
安全性 高(防篡改+认证) 低(仅完整性) 最高(完整性+身份+不可否认)
性能 最快
典型用途 API签名、服务间认证 数据校验、密码存储(不推荐) 数字证书、软件签名

选择建议

  • 用HMAC:需快速验证且能安全共享密钥的场景(如内部服务调用)。
  • 用MessageDigest:仅需快速哈希(如ETag生成),但避免用于安全敏感场景。
  • 用Signature:需非对称验证的场景(如对外公开API或跨信任边界通信)。

安全提醒

  • 避免使用MD5/SHA-1,优先选SHA-256或更安全的算法。
  • 密钥(如requestSecret)应通过安全渠道分发,并定期轮换。
posted @ 2025-03-27 13:06  VipSoft  阅读(36)  评论(0)    收藏  举报