kettle/ckettle进行参数对称加解密-AES为例

发布时间 2023-11-01 18:30:33作者: 橙木鱼

ckettle/kettle字段加密对称加密机制

方法调用链

kettle-core-2.3.0.1-SNAPSHOT.jar: 进行秘钥加密保护(不涉及实际业务处理)
	org.pentaho.di.core.encryption.Encr
	org.pentaho.di.core.encryption.TwoWayPasswordEncoderInterface
		使用BigInteger进行或运算来进行秘钥加密解密
symmetriccryptotrans-1.0.0-SNAPSHOT: 对称加密组件
	symmetriccryptotrans-1.0.0-SNAPSHOT.jar: 组件页面定义和加密方法触发
		org.pentaho.di.trans.steps.symmetriccryptotrans.SymmetricCryptoTrans: 加密方法触发
		org.pentaho.di.trans.steps.symmetriccryptotrans.SymmetricCryptoTransMeta: 页面参数存储和加工
		org.pentaho.di.trans.steps.symmetriccryptotrans.SymmetricCryptoTransData: 加密方法触发
	symmetricalgorithm-1.0.0-20210125.015921-2.jar: 对称加密规则处理
		org.pentaho.di.trans.steps.symmetriccrypto.symmetricalgorithm.SymmetricCrypto: 对称加密核心处理规则
		org.pentaho.di.trans.steps.symmetriccrypto.symmetricalgorithm.SymmetricCryptoInterface: 对称算法抽象接口
		org.pentaho.di.trans.steps.symmetriccrypto.symmetricalgorithm.AESSymmetricCrypto: aes算法实现类

因为kettle在对称算法时处理有删减(可能是考虑到不同算法的通用性),实际生成的秘钥无法通过标准的AES加解密验证.

示例数据:

data: 123456
secretKey: 11111111111111111111111111111111
encrypt: a3a9076f11e90da6bc740c9d73ec2b76
  • 流程配置

整体流程:

1 通过变量传入参数
2 然后对变量值加密
3 输出加密日志
4 对前一步的加密值解密
5 输出解密日志

加密配置:

操作:选择加密
算法:使用AES
方案: 这里为空即为默认.实际这个值也无法修改.代码里写的值为AES
秘钥: 加解密使用的秘钥
秘钥一个字段定: 使用指定字段作为秘钥(相当于设置动态秘钥),这里为空
秘钥字段: 指定的当做秘钥的字段
明文字段: 要进行加密的字段.这里是tel字段
密文字段: 加密后值绑定的字段

解密配置:

操作:选择解码
算法:使用AES
方案: 这里为空即为默认.实际这个值也无法修改.代码里写的值为AES
秘钥: 加解密使用的秘钥
秘钥一个字段定: 使用指定字段作为秘钥(相当于设置动态秘钥),这里为空
秘钥字段: 指定的当做秘钥的字段
明文字段: 要进行解密的字段.这里是上面加密值绑定的crypttel字段
密文字段: 解密后值绑定的字段

日志配置:

  • 服务端加解密代码

配套java生成aes秘钥方法:

package com.liu;

import org.apache.commons.codec.binary.Hex;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;

/**
 * @author 橙木鱼
 * @Description
 * @create 2023/10/27 14:23
 */
public class SymmetricCrypto {
    private Cipher cipher;
    private SecretKeySpec secretKeySpec;
    private String ALGORITHM = "AES";

    public SymmetricCrypto() throws Exception {
        try {
            this.cipher = Cipher.getInstance(ALGORITHM);
        } catch (Exception var3) {
            throw new Exception(var3);
        }
    }

    public void setEncryptMode() throws Exception {
        try {
            this.cipher.init(1, this.secretKeySpec);
        } catch (Exception var2) {
            throw new Exception(var2);
        }
    }

    public void setDecryptMode() throws Exception {
        try {
            this.cipher.init(2, this.secretKeySpec);
        } catch (Exception var2) {
            throw new Exception(var2);
        }
    }

    public void setSecretKey(String keyString) throws Exception {
        try {
            this.setSecretKey(Hex.decodeHex(keyString.toCharArray()));
        } catch (Exception var3) {
            throw new Exception(var3);
        }
    }

    public void setSecretKey(byte[] keyBytes) throws Exception {
        try {
            this.secretKeySpec = new SecretKeySpec(keyBytes, ALGORITHM);
        } catch (Exception var3) {
            throw new Exception(var3);
        }
    }


    public byte[] encrDecryptData(byte[] inpBytes) throws Exception {
        try {
            return this.cipher.doFinal(inpBytes);
        } catch (Exception var3) {
            throw new Exception(var3);
        }
    }

    /**
     * 验证数据
		secretKey: 11111111111111111111111111111111
		data: 123456
		encrypt: a3a9076f11e90da6bc740c9d73ec2b76
     * @param args
     * @throws CryptoException
     */
    public static void main(String[] args) throws Exception {
        SymmetricCrypto crypto = new SymmetricCrypto();
        String secretKey="11111111111111111111111111111111";
        crypto.setSecretKey(secretKey);
        // 加密
        crypto.setEncryptMode();
        String tel="123456";
        byte[] bytes = crypto.encrDecryptData(tel.getBytes(StandardCharsets.UTF_8));
        String encrypt = new String(Hex.encodeHex(bytes));
        System.out.println("encrypt: "+encrypt);

        // 解密
        crypto.setDecryptMode();
        byte[] dataBytes = Hex.decodeHex(encrypt.toCharArray());
        byte[] encrBytes = crypto.encrDecryptData(dataBytes);
        String decrypt = new String(encrBytes);
        System.out.println("decrypt: "+decrypt);
    }
}

输出结果:

encrypt: a3a9076f11e90da6bc740c9d73ec2b76
decrypt: 123456