添加依赖
AES加密解密需要包
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.15</version>
</dependency>
写一个AES 加密的工具类
/**
* aes 加密的工具类
* 1.存储 加密的秘钥key
* 2.实现 aes 加密
* 3.实现aes解密的功能
* @author whc
*/
public class AesUtil {
private static final Logger log = LoggerFactory.getLogger(AesUtil.class);
/**
* 定义 aes 加密的key
* 密钥 必须是16位, 自定义,
* 如果不是16位, 则会出现InvalidKeyException: Illegal key size
* 解决方案有两种:
* 需要安装Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files(可以在Oracle下载).
* .设置设置key的长度为16个字母和数字的字符窜(128 Bit/8=16字符)就不报错了。
*/
private static final String KEY = "KEYBYACSJAVAZXLL";
/**
* 偏移量
*/
private static final int OFFSET = 16;
private static final String TRANSFORMATION = "AES/CBC/PKCS5Padding";
private static final String ALGORITHM = "AES";
/**
* 加密
* @param content content
* @return String
*/
public static String encrypt(String content) {
return encrypt(content, KEY);
}
/**
* 解密
*
* @param content content
* @return String
*/
public static String decrypt(String content) {
return decrypt(content, KEY);
}
/**
* 加密
*
* @param content 需要加密的内容
* @param key 加密密码
* @return String
*/
public static String encrypt(String content, String key) {
try {
SecretKeySpec skey = new SecretKeySpec(key.getBytes(), ALGORITHM);
IvParameterSpec iv = new IvParameterSpec(key.getBytes(), 0, OFFSET);
Cipher cipher = Cipher.getInstance(TRANSFORMATION);
//定义加密编码
String charset = "utf-8";
byte[] byteContent = content.getBytes(charset);
// 初始化
cipher.init(Cipher.ENCRYPT_MODE, skey, iv);
byte[] result = cipher.doFinal(byteContent);
// 加密
return new Base64().encodeToString(result);
} catch (Exception e) {
log.debug("加密失败:{}",e.getMessage());
}
return null;
}
/**
* AES(256)解密
*
* @param content 待解密内容
* @param key 解密密钥
* @return 解密之后
*/
public static String decrypt(String content, String key) {
try {
SecretKeySpec skey = new SecretKeySpec(key.getBytes(), ALGORITHM);
IvParameterSpec iv = new IvParameterSpec(key.getBytes(), 0, OFFSET);
Cipher cipher = Cipher.getInstance(TRANSFORMATION);
// 初始化
cipher.init(Cipher.DECRYPT_MODE, skey, iv);
byte[] result = cipher.doFinal(new Base64().decode(content));
// 解密
return new String(result);
} catch (Exception e) {
log.debug("解密失败:{}",e.getMessage());
}
return null;
}
}
再来一个TypeHandler类继承BaseTypeHandler
/**
* @author whc
*/
public class TypeHandler extends BaseTypeHandler<String> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, AesUtil.encrypt(parameter));
}
@Override
public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
return AesUtil.decrypt(rs.getString(columnName));
}
@Override
public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return AesUtil.decrypt(rs.getString(columnIndex));
}
@Override
public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return AesUtil.decrypt(cs.getString(columnIndex));
}
}
随便数据库建一个user表测试一下
实体类
在类头加上注解@TableName(value = “sys_user”,autoResultMap = true) ;
在需要加密的字段加上@TableField(typeHandler = TypeHandler.class)
@TableName(value ="user", autoResultMap = true)
public class User {
//主键如果不叫id需要用这个注解指定一下
@TableId
private int id;
@TableField(typeHandler = TypeHandler.class)
private String username;
@TableField(typeHandler = TypeHandler.class)
private String password;
private Date birthday;
private String phone;
...........
Get and Set
...........
写个添加test一下
/*
* 增加
* */
@Test
public void insertOne(){
User user = new User();
user.setId(90);
user.setUsername("whc");
user.setPassword("999999999");
user.setBirthday(new Date());
user.setPhone("12323");
userMapper.insert(user);
}
看效果
查询也可以得到数据
/*
* 根据主键查询一个
* */
@Test
public void testSelectOne(){
User user = userMapper.selectById(90);
System.out.println("user ------- " + user);
}
看效果
还不会点个赞私信我