java 请求参数加解密

项目开发中,需要针对请求参数加密 解密操作 可以使用下列工具类
oap.security.enabled=true
oap.security.enableIgnoreAnnotation=true
oap.security.secretKey=MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCOH4vp2PiV45ar4DFsvACGRxvpvqafKMyduCRRZ7CRKnH0W0oXmRKjsyTde//XZ5IOKxFXrRrDWlPV4PFHZH8wVh0iAyvrtZXeaDi7d9MoumBN77gK2Ji1/Oiezt5BCaIMIN/WM9bxaMLxQ2BtVwQQHFdasjpz1PKwq3J4oVDe4BAklnLPJbVJRpXiyUTUGZiIRQlkiEM2xsUyGvd1hl03pC8PUq5WGuSNNnL1RYb8LGlZSqFfgnpnX1TfQaS3zSDgQrfLDfqKAeqUdvGWIS2Tfn/BXsAqDRdWjvMR4wJjZIIrT6VKUyWgwmQxWyJ//c4vK9zBAsGv/CR8hxClowK7AgMBAAECggEAGQwaPmZMuS3Y+gWS8FTZytBxbOp6twYbuZggXnBlv8+5MZV9I1eI32zNDHO0DSRlqzWP4uHRG6ipqcHxA+IEQGKM09e3P91Kwl2f0fo2LrFaE6Ixz0eI8lnWLVbL+K5X7sdEa53LPdR2tspnDh4Ny0ETbBqJDqzy8IvmqrfTZtPWX7nrChIms7izz1dVocU19OmtxSestNGT0CIfmtGZVkJlsNjhaaFiRRD4whv0skVVoQ5MkTkFRwxap/QDi4KLUKLcIYCEetYZvMatk91vhsqIA2Sq+fr+BCXf3XOVs2BQERygC4KWXQC872ymmBWiCw3Eqrt3bWe7/zx9YYqBQQKBgQDbanFAwh+MBlP9+c6VqJilMee1LmI9fu6eFXx5gnU1OeQeklIlTA6m520d/CKIKbUVfSkm3yYowqy5+wSOawKAMlUAqgU3BfEbGo886szmPNSukqrEwb/xeOwOEfyegyGjSkzQYteEw3FtgHwKSQWeYfVQovwylNJXgQrlc9xF8QKBgQCl0fGJBk3S9K0B2v1/71/5zoEWWqTDFKm575UOQ4qz8OaWYO3d9lkcCUcNiQNIRTBb60r6lBieEKWfig7+/lPDaD1QMGbrP73nCi/SOYOishGHdwhrra1ML2GkVqn9DkZAgRFYjvGijt+0U6ggT4XQqAZ04Lc04JQ0HUwaNzs3awKBgFHavs9a3Cv/vFvWUrRQRknyeS+FU07/yIMfHuWxvooRw8GH8q9JVXn8gh+ajUNg09Zlb/G5c+Hm5ksnkwaSc0dh/4YU54ckZ1MmMGOYcMI/1VQfESf/49xwsRd6rFRyNR1WvZtMFHzJ8MnaEexAW6E/iCYB97XjASl10ZvSAk3xAoGBAI50NFqRbd5jkRXc+pckIIHNZJy9tnpZkA5KwvUEFW7M8GwUTYW4k4lAdygrowQ9XHQ7SajH/fYdOww6YPOzrmZbcQEo8+H6WrzXxYmHG410CRclrbhD9nNS6UFzqonZ74SO3UYFV5VdxNV4YSGQ79b34sQaIYptvSSgXrbO6DKNAoGADsPfjDjLGB+rBHIdviBXr6Cc3BP/jOzuQZQ85xUrsuMbAfjilxDSpZE5LhiPVv/cD2VklOr0Nksu7BQAoh1Sz91uUjDmrYayjRZ4PlDx98nYFfoko/rQzLY070SIjykHbDopHuMTh2VvlbOBzlXqDBzKRoUMCbKUFRBs1dBzY18=
oap.security.public.secretKey=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjh+L6dj4leOWq+AxbLwAhkcb6b6mnyjMnbgkUWewkSpx9FtKF5kSo7Mk3Xv/12eSDisRV60aw1pT1eDxR2R/MFYdIgMr67WV3mg4u3fTKLpgTe+4CtiYtfzons7eQQmiDCDf1jPW8WjC8UNgbVcEEBxXWrI6c9TysKtyeKFQ3uAQJJZyzyW1SUaV4slE1BmYiEUJZIhDNsbFMhr3dYZdN6QvD1KuVhrkjTZy9UWG/CxpWUqhX4J6Z19U30Gkt80g4EK3yw36igHqlHbxliEtk35/wV7AKg0XVo7zEeMCY2SCK0+lSlMloMJkMVsif/3OLyvcwQLBr/wkfIcQpaMCuwIDAQABp

配置

@ConfigurationProperties(
    prefix = "oap.security"
)
public class SecurityProperties {
    private boolean enabled;
    private boolean enableIgnoreAnnotation;
    private Class<? extends Annotation> annotationClass = IgnoreRequestSecurity.class;
    private String secretKey;

    public SecurityProperties() {
    }

    public boolean isEnabled() {
        return this.enabled;
    }

    public void setEnabled(boolean enabled) {
        this.enabled = enabled;
    }

    public void setEnableIgnoreAnnotation(boolean enableIgnoreAnnotation) {
        this.enableIgnoreAnnotation = enableIgnoreAnnotation;
    }

    public boolean isEnableIgnoreAnnotation() {
        return this.enableIgnoreAnnotation;
    }

    public Class<? extends Annotation> getAnnotationClass() {
        return this.annotationClass;
    }

    public void setAnnotationClass(Class<? extends Annotation> annotationClass) {
        this.annotationClass = annotationClass;
    }

    public String getSecretKey() {
        return this.secretKey;
    }

    public void setSecretKey(String secretKey) {
        this.secretKey = secretKey;
    }
}
public class RsaDeEnServiceImpl implements RsaDeEnService {
    private final LogUtil log = LogUtil.of(RsaDeEnServiceImpl.class,null);

    @Autowired
    private SecurityProperties secretProperties;

    @Value("${oap.security.public.secretKey}")
    private String publicKey;

    private static final String AES = "AES";
    private static final String CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding";
    private static Base64.Encoder base64Encoder = Base64.getEncoder();
    private static Base64.Decoder base64Decoder = Base64.getDecoder();
    /**
     * 加密
     * @param content
     * @return
     */
    @Override
    public RsaResultVo encryptContext(String content) throws Exception{
        RsaResultVo result=new RsaResultVo();
        String IV = "OapManagement" + UUID.randomUUID().toString();
        log.info("加密", "IV: " + IV);
        int v = (int)(Math.random() * 9 + 1) * 100000;
        String IKEY = System.currentTimeMillis() + String.valueOf(v);
        log.info("加密", "IKEY: " + IKEY);
        String ikey = SecureUtil.md5(IKEY).substring(0,32);
        String iv = SecureUtil.md5(IV).substring(0,16);
        //1.先用内容+IKEY和IV 进行AES256 加密操作
        SecretKey secretKey = new SecretKeySpec(ikey.getBytes(), "AES");
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(1, secretKey, new IvParameterSpec(iv.getBytes(StandardCharsets.UTF_8)));
        byte[] byteEncode = content.getBytes(StandardCharsets.UTF_8);
        byte[] byteAES = cipher.doFinal(byteEncode);
        String s = base64Encoder.encodeToString(byteAES);
        SecurityContent param=new SecurityContent();
        param.setContent(s);
        String s2 = JSON.toJSONString(param);
        result.setContext(s2);
        //2.再把IKEY和IV 进行RSA 加密
        Map<String,Object> signatureKey=new HashMap<>();
        signatureKey.put("IKEY",ikey);
        signatureKey.put("IV",iv);
        String s1 = JSON.toJSONString(signatureKey);
        byte[] decoded = Base64.getDecoder().decode(publicKey);
        RSAPublicKey pubKey = (RSAPublicKey)KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));
        Cipher cipherRsa = Cipher.getInstance("RSA");
        cipherRsa.init(1, pubKey);
        result.setSignatureKey(Base64.getEncoder().encodeToString(cipherRsa.doFinal(s1.getBytes(StandardCharsets.UTF_8))));
        return result;

    }

    /**
     * 解密
     * @param content
     * @param signatureKey
     * @return
     */
    @Override
    public String decryptContext(String content,String signatureKey) throws Exception{
        //1.先获取signatureKey 通过RSA 解密 得到IKEY和IV
        byte[] inputByte = Base64.getDecoder().decode(signatureKey);
        byte[] decoded = Base64.getDecoder().decode(this.secretProperties.getSecretKey());
        RSAPrivateKey priKey = (RSAPrivateKey)KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(2, priKey);
        String s = new String(cipher.doFinal(inputByte));
        JSONObject jsonObject = JSONObject.parseObject(s);
        String iKey = jsonObject.getString("IKEY");
        log.info("解密", "IKEY: " + iKey);
        String vi = jsonObject.getString("IV");
        log.info("解密", "IV: " + vi);
        String decryptBody =JSON.toJSONString(content);
        log.info("解密", "body of  before decrypt: " + decryptBody);
        SecurityContent content2 = (SecurityContent)JSON.parseObject(content, SecurityContent.class);
        if (content != null && !StringUtils.isEmpty(content2.getContent())) {
            String json = AesUtil256.decode(iKey, content2.getContent(), vi);
            log.info("解密", "body of  after decrypt:" + json);
            return json;
        } else {
            return null;
        }
    }
Java 中进行 GET 请求加解密,可以使用以下步骤: 1. 构建请求参数:将需要发送的参数按照要求进行组装。可以是将参数拼接在 URL 后面,或者使用 `NameValuePair` 或 `Map` 来存储参数。 2. 对请求参数进行加密:根据需求选择合适的加密算法,如 AES、DES、RSA 等。可以使用 Java 提供的加密库,如 `javax.crypto` 包下的类来实现。 3. 发送加密后的请求:将加密后的参数附加到 GET 请求的 URL 中或者作为请求头的一部分发送给服务器。 4. 服务器解密请求参数:服务器端接收到请求后,根据相应的加密算法和密钥,对请求参数进行解密。 下面是一个简单示例,使用 AES 加密对 GET 请求进行加解密: ```java import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.util.Base64; public class GetRequestEncryptionExample { private static final String SECRET_KEY = "0123456789abcdef"; // 密钥,必须是 16 位 public static String encrypt(String plainText) throws Exception { SecretKeySpec secretKey = new SecretKeySpec(SECRET_KEY.getBytes(), "AES"); Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.ENCRYPT_MODE, secretKey); byte[] encryptedBytes = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8)); return Base64.getEncoder().encodeToString(encryptedBytes); } public static String decrypt(String encryptedText) throws Exception { SecretKeySpec secretKey = new SecretKeySpec(SECRET_KEY.getBytes(), "AES"); Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.DECRYPT_MODE, secretKey); byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedText)); return new String(decryptedBytes, StandardCharsets.UTF_8); } public static void main(String[] args) { try { // 加密请求参数 String plainText = "param1=value1&param2=value2"; String encryptedText = encrypt(plainText); String encodedEncryptedText = URLEncoder.encode(encryptedText, StandardCharsets.UTF_8); // 构建 GET 请求 URL String url = "https://example.com/api?data=" + encodedEncryptedText; // 发送 GET 请求 // 服务器端接收到请求后,解密请求参数 String decodedEncryptedText = URLDecoder.decode(encodedEncryptedText, StandardCharsets.UTF_8); String decryptedText = decrypt(decodedEncryptedText); System.out.println("Decrypted Text: " + decryptedText); } catch (Exception e) { e.printStackTrace(); } } } ``` 注意:以上示例仅为演示加解密的基本流程,并不考虑完整的安全性和异常处理。实际使用中,需要根据具体的需求和安全要求进行适当的调整和完善。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值