Java案例如何实现服务加密?

wen python案例 2

本文目录导读:

Java案例如何实现服务加密?

  1. 核心加密技术分类
  2. Java加密标准实现(JCA/JCE)
  3. Spring Boot集成加密(服务间通信)
  4. 专业加密库推荐
  5. 生产环境最佳实践
  6. 完整的加密REST API示例

在Java中实现服务加密通常涉及以下几个层面的技术方案,具体选择取决于你的业务场景(如数据传输加密、数据存储加密、身份认证加密等),以下是详细实现指南:

核心加密技术分类

对称加密(AES/DES/3DES)

  • 特点:加密和解密使用同一密钥,速度快
  • 适用场景:大数据量加密、内部系统通信
  • 常用算法:AES-256(推荐)、ChaCha20

非对称加密(RSA/ECC)

  • 特点:公钥加密、私钥解密,安全性高但速度慢
  • 适用场景:密钥交换、数字签名、小额数据加密
  • 常用算法:RSA-2048(推荐)、ECDSA

哈希算法(SHA-256/SHA-3)

  • 特点:不可逆,用于数据完整性校验
  • 适用场景:密码存储、数据校验、数字签名

Java加密标准实现(JCA/JCE)

Java通过java.securityjavax.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加密数据库密码(最简方案)

  1. 添加依赖

    <dependency>
     <groupId>com.github.ulisesbocchio</groupId>
     <artifactId>jasypt-spring-boot-starter</artifactId>
     <version>3.0.5</version>
    </dependency>
  2. 配置文件加密

    spring.datasource.password=ENC(加密后的密文)
  3. 生成密文

    java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI \
    input="root" password=yourMasterKey algorithm=PBEWithMD5AndDES

生产环境最佳实践

密钥管理(最关键的安全环节)

  1. 密钥分离:加密密钥与加密数据分开存储
  2. 密钥轮换:每月更新一次加密密钥
  3. 密钥托管:使用AWS KMS、HashiCorp Vault等密钥管理服务
  4. 硬件安全模块:高安全场景使用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加密、数据库加密、还是传输加密)选择合适的方案,欢迎进一步说明需求以便提供更精准的代码示例。

抱歉,评论功能暂时关闭!