签名方法 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
)应通过安全渠道分发,并定期轮换。
本文来自博客园,作者:VipSoft 转载请注明原文链接:https://www.cnblogs.com/vipsoft/p/18795795