本文目录导读:

在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加密、数据库加密、还是传输加密)选择合适的方案,欢迎进一步说明需求以便提供更精准的代码示例。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播