好的,下面是对 HMAC-SHA1 加密算法在 Java 中的原理讲解和实现代码,适合做为《Java加密技术》系列的第一篇入门文章。


🔐 Java加密技术(一):HMAC-SHA1 加密算法详解

在现代软件开发中,数据安全性尤为重要。消息摘要、数字签名、对称加密和非对称加密技术广泛应用于系统登录、数据传输和身份验证等场景中。

本文重点讲解一种常见的消息认证算法 —— HMAC-SHA1(Hash-based Message Authentication Code with SHA1),并附带 Java 实现示例。


📌 一、HMAC-SHA1 是什么?

✅ HMAC(Hash-based Message Authentication Code)

HMAC 是一种基于哈希函数(如 SHA-1、SHA-256 等)和密钥的消息认证机制,用于验证消息完整性和真实性。

✅ HMAC-SHA1

HMAC-SHA1 就是以 SHA1 作为底层哈希函数的 HMAC 算法。它不会加密数据本身,但会生成一个唯一摘要,防止消息被篡改。


🔐 二、HMAC-SHA1 应用场景

  • API 请求签名(如 AWS、阿里云)
  • 接口防篡改验证
  • JWT 签名算法的一种选择
  • OAuth 1.0 鉴权协议中使用

🧪 三、Java 实现示例

🔧 所需类:

  • javax.crypto.Mac
  • javax.crypto.spec.SecretKeySpec

✅ 示例代码:

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class HmacSha1Example {

    // HMAC-SHA1 加密
    public static String hmacSha1(String key, String data) throws Exception {
        // 创建 Mac 对象
        Mac mac = Mac.getInstance("HmacSHA1");
        
        // 设置密钥
        SecretKeySpec secretKey = new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA1");
        mac.init(secretKey);
        
        // 执行加密
        byte[] hmacBytes = mac.doFinal(data.getBytes("UTF-8"));
        
        // 返回 Base64 编码结果
        return Base64.getEncoder().encodeToString(hmacBytes);
    }

    public static void main(String[] args) throws Exception {
        String key = "mySecretKey";
        String message = "Hello, world!";
        
        String signature = hmacSha1(key, message);
        System.out.println("HMAC-SHA1 签名结果: " + signature);
    }
}

🧠 四、输出示例

HMAC-SHA1 签名结果: o3qG2XaL5L3ks65JZ4QoYh3DgCk=

📎 五、注意事项

问题说明
加密后数据是否可逆?不可逆。HMAC 只能用来验证数据完整性,不用于数据还原。
是否需要加盐?HMAC 本质是带密钥的哈希,安全性已经比普通 SHA1 更强,但可以额外加盐增强唯一性。
Base64 还是 Hex 输出?根据应用场景而定,很多接口要求 Base64 格式签名(如 HTTP 请求头)。

🔁 六、与 SHA1 的区别

特性SHA1HMAC-SHA1
是否带密钥❌ 无✅ 有
适用场景简单摘要验证安全签名验证
是否可被伪造✅ 可(攻击风险)❌ 不可(有密钥)

✅ 七、小结

HMAC-SHA1 是一种安全、高效的消息认证方式,常用于防止请求被中间人篡改。在现代项目中,虽然 HMAC-SHA256 更推荐,但 SHA1 在某些兼容性场景下仍被广泛使用。