添加依赖
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);
    }

看效果
在这里插入图片描述
还不会点个赞私信我

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐