签名方法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 已不安全,应禁用
  • 在两个可信系统之间通信,需要防止数据被篡改并验证对方身份?

  • 需要向公众或客户证明某个文件、软件或消息确实是你发出的,且无法抵赖?

    • 选 Signature (如 SHA256withRSA)
    • 例如: 发布软件更新、签署重要电子文档。

现代实践通常是组合使用

一个安全的系统通常会组合使用以上多种技术:

  1. HTTPS (TLS)

    • Signature: 用于身份认证和密钥交换(服务器用私钥证明身份)。
    • AES: 用于加密所有传输数据,提供机密性
    • MAC (或AEAD模式): 用于保证加密数据的完整性
  2. 安全数据存储

    • MessageDigest: 对密码进行加盐哈希后存储,验证时对比哈希值。
    • AES: 加密数据库中的敏感信息(如身份证号、银行卡号)。
  3. ** authenticated Encryption (认证加密)**

    • 直接使用像 AES-GCM 这样的模式,它同时提供了 AES 的加密功能和 MAC 的认证功能,是现代应用的推荐做法。
posted @ 2025-03-27 13:06  VipSoft  阅读(103)  评论(0)    收藏  举报