好的,下面是对 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 的区别
特性 | SHA1 | HMAC-SHA1 |
---|---|---|
是否带密钥 | ❌ 无 | ✅ 有 |
适用场景 | 简单摘要验证 | 安全签名验证 |
是否可被伪造 | ✅ 可(攻击风险) | ❌ 不可(有密钥) |
✅ 七、小结
HMAC-SHA1 是一种安全、高效的消息认证方式,常用于防止请求被中间人篡改。在现代项目中,虽然 HMAC-SHA256 更推荐,但 SHA1 在某些兼容性场景下仍被广泛使用。
发表回复