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
标签:AES,加密,String,为例,kettle,Exception,秘钥,org,new
From: https://www.cnblogs.com/chengmuyu/p/17803766.html