本文目录导读:

在Java中实现服务加密通常涉及以下几个层面的技术方案,具体选择取决于你的业务场景(如数据传输加密、数据存储加密、身份认证加密等),以下是详细实现指南:
核心加密技术分类
对称加密(AES/DES/3DES)
- 特点:加密和解密使用同一密钥,速度快
- 适用场景:大数据量加密、内部系统通信
- 常用算法:AES-256(推荐)、ChaCha20
非对称加密(RSA/ECC)
- 特点:公钥加密、私钥解密,安全性高但速度慢
- 适用场景:密钥交换、数字签名、小额数据加密
- 常用算法:RSA-2048(推荐)、ECDSA
哈希算法(SHA-256/SHA-3)
- 特点:不可逆,用于数据完整性校验
- 适用场景:密码存储、数据校验、数字签名
Java加密标准实现(JCA/JCE)
Java通过java.security和javax.crypto包提供加密API,无需第三方库即可完成基本加密。
示例1:AES对称加密(推荐用于请求体加密)
import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.security.SecureRandom;
import java.util.Base64;
public class AESUtil {
// 密钥长度必须为16/24/32字节(对应128/192/256位)
private static final String SECRET_KEY = "MySecretKey123456"; // 必须16字节
// 加密
public static String encrypt(String data) throws Exception {
SecretKeySpec keySpec = new SecretKeySpec(
SECRET_KEY.getBytes("UTF-8"), "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
byte[] encrypted = cipher.doFinal(data.getBytes("UTF-8"));
return Base64.getEncoder().encodeToString(encrypted);
}
// 解密
public static String decrypt(String encryptedData) throws Exception {
SecretKeySpec keySpec = new SecretKeySpec(
SECRET_KEY.getBytes("UTF-8"), "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, keySpec);
byte[] decrypted = cipher.doFinal(
Base64.getDecoder().decode(encryptedData));
return new String(decrypted, "UTF-8");
}
}
示例2:RSA非对称加密(用于客户端-服务器密钥交换)
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
public class RSAUtil {
public static KeyPair generateKeyPair() throws Exception {
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
generator.initialize(2048);
return generator.generateKeyPair();
}
// 公钥加密
public static String encrypt(String data, PublicKey publicKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encrypted = cipher.doFinal(data.getBytes("UTF-8"));
return Base64.getEncoder().encodeToString(encrypted);
}
// 私钥解密
public static String decrypt(String encryptedData, PrivateKey privateKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decrypted = cipher.doFinal(
Base64.getDecoder().decode(encryptedData));
return new String(decrypted, "UTF-8");
}
}
示例3:密码哈希存储(BCrypt/SHA-256 + Salt)
import java.security.MessageDigest;
import java.security.SecureRandom;
import java.util.Base64;
public class PasswordUtil {
// 推荐:使用SHA-256加盐(生产环境建议用BCrypt/Argon2)
public static String hashPassword(String password, String salt) throws Exception {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
digest.update(salt.getBytes("UTF-8"));
byte[] hash = digest.digest(password.getBytes("UTF-8"));
return Base64.getEncoder().encodeToString(hash);
}
// 生成随机盐值
public static String generateSalt() {
SecureRandom random = new SecureRandom();
byte[] salt = new byte[16];
random.nextBytes(salt);
return Base64.getEncoder().encodeToString(salt);
}
}
Spring Boot集成加密(服务间通信)
HTTPS配置(传输层加密)
# application.yml 配置SSL
server:
port: 8443
ssl:
key-store: classpath:keystore.p12
key-store-password: yourpassword
key-store-type: PKCS12
key-alias: tomcat
Spring Cloud Config加密
若使用Spring Cloud Config Server,可自动加解密配置属性:
# bootstrap.yml encrypt: key: your-encryption-key
访问配置中心时,对敏感数据使用{cipher}前缀:
database.password: "{cipher}AQA...encrypted_value"
自定义加密过滤器(请求/响应加密)
@Component
public class EncryptFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
// 1. 解密请求体
if (req.getHeader("X-Encrypted") != null) {
// 调用AESUtil.decrypt() 解密请求体
}
// 2. 包装响应,加密响应体
EncryptWrapper wrappedResponse = new EncryptWrapper(response);
chain.doFilter(request, wrappedResponse);
// 3. 获取响应数据并加密
String originalData = wrappedResponse.getDataAsString();
String encryptedData = AESUtil.encrypt(originalData);
response.getWriter().write(encryptedData);
}
}
数据库字段加密(MyBatis/JPA拦截器)
@Component
public class EncryptInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
Object[] args = invocation.getArgs();
MappedStatement ms = (MappedStatement) args[0];
Object parameter = args[1];
// 对敏感字段(如身份证号、手机号)自动加密
if (parameter.getClass().getAnnotation(NeedEncrypt.class) != null) {
Field[] fields = parameter.getClass().getDeclaredFields();
for (Field field : fields) {
if (field.isAnnotationPresent(EncryptField.class)) {
field.setAccessible(true);
String original = (String) field.get(parameter);
field.set(parameter, AESUtil.encrypt(original));
}
}
}
return invocation.proceed();
}
}
专业加密库推荐
| 库名称 | 特点 | 用途 |
|---|---|---|
| Jasypt | 零配置Spring集成 | 配置文件中敏感数据加密 |
| Bouncy Castle | 提供Java标准库没有的算法 | 国密算法(SM2/3/4) |
| Google Tink | 简单易用,防误用 | 通用加密操作 |
| Apache Shiro | 完整安全框架 | 认证+授权+加密 |
使用Jasypt加密数据库密码(最简方案)
-
添加依赖:
<dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>3.0.5</version> </dependency>
-
配置文件加密:
spring.datasource.password=ENC(加密后的密文)
-
生成密文:
java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI \ input="root" password=yourMasterKey algorithm=PBEWithMD5AndDES
生产环境最佳实践
密钥管理(最关键的安全环节)
- 密钥分离:加密密钥与加密数据分开存储
- 密钥轮换:每月更新一次加密密钥
- 密钥托管:使用AWS KMS、HashiCorp Vault等密钥管理服务
- 硬件安全模块:高安全场景使用HSM
加密策略选择
| 场景 | 推荐方案 | 原因 |
|---|---|---|
| 内部微服务间通信 | AES-256 + HTTPS | 性能优先,密钥管理可控 |
| 外部API接口 | RSA-2048 + 数字签名 | 非对称加密,无需密钥分发 |
| 用户密码存储 | BCrypt(成本因子12+) | 防止彩虹表攻击 |
| 敏感配置信息 | Jasypt + Vault | 动态密钥获取 |
| 数据库字段 | AES-256-GCM | 自带认证加密,防篡改 |
安全注意事项
- 🚫 永远不要将密钥硬编码在代码中,使用环境变量或配置中心
- ✅ 必须使用IV(初始化向量),避免相同明文产生相同密文
- 🔄 加密算法要使用经过验证的标准实现(如Java原生库)
- 📊 性能优化:大文件加密建议分段处理,避免内存溢出
完整的加密REST API示例
@RestController
public class SecureController {
@Autowired
private PrivateKey privateKey; // 从密钥管理服务注入
@PostMapping("/secure-data")
public ResponseEntity<String> handleSecureData(
@RequestBody EncryptedRequest request) {
try {
// 1. 解密请求体
String decryptedData = RSAUtil.decrypt(
request.getData(), privateKey);
// 2. 处理业务逻辑
String businessResult = processData(decryptedData);
// 3. 加密响应
String encryptedResult = AESUtil.encrypt(businessResult);
return ResponseEntity.ok(encryptedResult);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
}
}
}
需要根据你的具体业务场景(是API加密、数据库加密、还是传输加密)选择合适的方案,欢迎进一步说明需求以便提供更精准的代码示例。