签名方法AES、 Mac、MessageDigest、Signature
Java Hutool 实现非对称加密(RSA):https://www.cnblogs.com/vipsoft/p/18674812
这三种签名方式(AES、Mac、MessageDigest、Signature)在Java加密体系中有不同的用途和适用场景,以下是它们的区别和典型使用场景:
1. AES
详见:https://www.cnblogs.com/vipsoft/p/18797351
2. MAC (Message Authentication Code) - HmacSHA256
应用:[DevOps 运维提醒 钉钉 机器人 群通知 & sign 签名]:https://www.cnblogs.com/vipsoft/p/16048391.html#sign
代码示例:第一个sign方法
特点:
- 基于对称密钥(双方共享同一个密钥 requestSecret)。
- 使用哈希算法(如SHA256)结合密钥生成消息认证码,保证消息的完整性和真实性。
- 需要双方预先安全地共享密钥。
典型场景:
- API请求签名(如验证请求未被篡改)。
- 服务间通信的身份验证(如微服务调用)。
- 防止重放攻击(结合时间戳 timestamp)。
示例:
String signature = sign(System.currentTimeMillis());
public String sign(Long timestamp) {
    try {
        String appSecret = "SECfd5138XXXXXXXXXXXXXXXXXXXXXXXX";
        String stringToSign = timestamp + "\n" + appSecret;
        Mac mac = Mac.getInstance("HmacSHA256");
        mac.init(new SecretKeySpec(appSecret.getBytes("UTF-8"), "HmacSHA256"));
        byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
        return new String(Base64.encodeBase64(signData));
    } catch (Exception ex) {
        return "";
    }
}
4. MessageDigest (哈希摘要) - SHA-256
代码示例:第二个getSign方法
特点:
- 单向哈希函数(如MD5、SHA-1),无密钥参与。
- 生成固定长度的摘要,用于校验数据完整性,但无法防篡改(需配合其他机制)。
- 代码中拼接 appSecret是一种简易的“加盐”操作,但不如HMAC安全。
典型场景:
- 密码存储(需配合盐值,但MD5已不推荐,应使用BCrypt/PBKDF2)。
- 文件/数据完整性校验(如下载文件校验MD5)。
- 快速去重(如判断内容是否重复)。
注意:
- MD5易受碰撞攻击,重要场景应改用SHA-256。
- 示例中的 Base64编码是多余的,通常直接输出十六进制字符串。
4. Signature (数字签名) - SHA256withRSA
代码示例:第三个sign方法
特点:
- 基于非对称加密(私钥签名,公钥验证)。
- 使用RSA/ECDSA等算法,同时实现完整性、真实性和不可否认性。
- 计算开销较大,但无需共享密钥。
典型场景:
- 数字证书(如HTTPS的TLS握手)。
- 软件/固件签名(验证发布者身份)。
- 区块链交易签名。
示例:
String signature = sign(privateKey, "data".getBytes());
加密工具对比总结
| 特性 | AES | MAC (如 HmacSHA256) | MessageDigest (如 SHA-256) | Signature (如 SHA256withRSA) | 
|---|---|---|---|---|
| 核心功能 | 机密性 (加密/解密) | 完整性与认证 (防篡改+验证来源) | 完整性 (数据指纹/防篡改) | 完整性、认证与不可否认性 (防篡改+验证来源+抗抵赖) | 
| 密钥类型 | 对称密钥 (加密解密同一把密钥) | 对称密钥 (双方共享同一把密钥) | 无密钥 (或使用“盐”增强安全) | 非对称密钥对 (私钥签名,公钥验证) | 
| 输出结果 | 密文 (长度与原文相关) | 固定长度MAC标签 (如256位) | 固定长度哈希值 (如256位) | 固定长度签名值 | 
| 是否可逆 | 是 | 否 | 否 (单向函数) | 否 (但验证过程可还原哈希值) | 
| 性能 | 快 (硬件优化) | 非常快 | 极快 | 慢 (数学计算复杂) | 
| 主要安全目标 | 保密,防止信息泄露 | 确保消息未被篡改且来自预期发送方 | 确保数据一致,未被修改 | 确保消息未被篡改、来自特定发送方且该发送方无法否认 | 
| 典型应用场景 | 全盘加密、HTTPS数据传输加密、数据库字段加密 | API请求签名、JWT令牌、服务间通信认证 | 文件完整性校验、Git提交ID、密码存储(需加密) | SSL/TLS证书、软件代码签名、电子合同、区块链交易 | 
如何选择:一句话指南
- 
想要保密,防止别人看到内容? - 选 AES。
 
- 
想确认数据在传输中没被意外损坏或改动? - 选 MessageDigest (如 SHA-256)。
- 注意: MD5/SHA-1 已不安全,应禁用。
 
- 
在两个可信系统之间通信,需要防止数据被篡改并验证对方身份? - 选 MAC (如 HmacSHA256)。
- 例如: 你的手机App和你的服务器之间的API通信。 https://www.cnblogs.com/vipsoft/p/16048391.html#sign
 
- 
需要向公众或客户证明某个文件、软件或消息确实是你发出的,且无法抵赖? - 选 Signature (如 SHA256withRSA)。
- 例如: 发布软件更新、签署重要电子文档。
 
现代实践通常是组合使用
一个安全的系统通常会组合使用以上多种技术:
- 
HTTPS (TLS) - Signature: 用于身份认证和密钥交换(服务器用私钥证明身份)。
- AES: 用于加密所有传输数据,提供机密性。
- MAC (或AEAD模式): 用于保证加密数据的完整性。
 
- 
安全数据存储 - MessageDigest: 对密码进行加盐哈希后存储,验证时对比哈希值。
- AES: 加密数据库中的敏感信息(如身份证号、银行卡号)。
 
- 
** authenticated Encryption (认证加密)** - 直接使用像 AES-GCM 这样的模式,它同时提供了 AES 的加密功能和 MAC 的认证功能,是现代应用的推荐做法。
 
本文来自博客园,作者:VipSoft 转载请注明原文链接:https://www.cnblogs.com/vipsoft/p/18795795
 
                    
                 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号