• 使用mybatis或mybatisplus存储数据库加密,解密


    
    /**
     * @author kxs
     * @email 1965654634@qq.com
     */
    import com.chinaunicom.cpic.iot.dap.common.utils.AESUtils;
    import org.apache.ibatis.type.BaseTypeHandler;
    import org.apache.ibatis.type.JdbcType;
    
    import java.sql.CallableStatement;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    /**
     * @author xrp
     */
    public class TypeHandler extends BaseTypeHandler<String> {
        @Override
        public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
            ps.setString(i, AESUtils.encrypt(parameter,"1234567891234567"));
        }
    
        @Override
        public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
            return AESUtils.decrypt(rs.getString(columnName),"1234567891234567");
        }
    
        @Override
        public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
            return AESUtils.decrypt(rs.getString(columnIndex),"1234567891234567");
        }
    
        @Override
        public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
            return AESUtils.decrypt(cs.getString(columnIndex),"1234567891234567");
        }
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    import lombok.extern.slf4j.Slf4j;
    import sun.misc.BASE64Decoder;
    import sun.misc.BASE64Encoder;
    
    import javax.crypto.Cipher;
    import javax.crypto.KeyGenerator;
    import java.security.Key;
    import java.security.SecureRandom;
    
    /**
     * @ClassName AESUtils
     * @Description AES工具类
     */
    @Slf4j
    public class AESUtils {
    
        // optional value AES/DES/DESede
        public static final String CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";
    
        public static Key getKey(String strKey) {
            try {
                if (strKey == null) {
                    strKey = "";
                }
                KeyGenerator _generator = KeyGenerator.getInstance("AES");
                SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
                secureRandom.setSeed(strKey.getBytes());
                _generator.init(128, secureRandom);
                return _generator.generateKey();
            } catch (Exception e) {
                throw new RuntimeException(" 密钥出现异常 ");
            }
        }
    
        public static String encrypt(String data, String key) {
            try {
                SecureRandom sr = new SecureRandom();
                Key secureKey = getKey(key);
                Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
                cipher.init(Cipher.ENCRYPT_MODE, secureKey, sr);
                byte[] bt = cipher.doFinal(data.getBytes());
                String strS = new BASE64Encoder().encode(bt);
                return strS;
            }catch (Exception e){
                log.error("加密失败,",e);
                throw new RuntimeException(802,"加密失败");
            }
    
    
        }
    
        public static String decrypt(String message,String key) {
            try {
                SecureRandom sr = new SecureRandom();
                Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
                Key secureKey = getKey(key);
                cipher.init(Cipher.DECRYPT_MODE, secureKey, sr);
                byte[] res = new BASE64Decoder().decodeBuffer(message);
                res = cipher.doFinal(res);
                return new String(res,"UTF-8");
            }catch (Exception e){
                log.error("解密失败,",e);
                throw new BusinessException(802,"解密失败");
            }
    
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68

    在类头加上注解@TableName(value = “表名”,autoResultMap = true) ;
    在需要加密的字段加上@TableField(typeHandler = TypeHandler.class)

    
    ``
    
    
    • 1
    • 2
    • 3
  • 相关阅读:
    自动驾驶行业观察之2023上海车展-----车企发展趋势(3)
    新能源汽车行业出口ERP管理解决方案
    Linux内存管理(二十六):shrink_list
    笔试强训第18天
    Go 企业级框架 Gin 版全新发布
    OpenHarmony应用分发运营体系
    数据之道读书笔记-10未来已来:数据成为企业核心竞争力
    【动态规划】区间动态规划
    DolphinScheduler3.0.0 集群部署过程
    大数据面试题
  • 原文地址:https://blog.csdn.net/k_x_sh/article/details/134003625