签名方法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  阅读(213)  评论(0)    收藏  举报