Java通过MySQL的加解密函数实现敏感字段存储

 更新时间:2022年03月01日 08:55:30   作者:灰太狼_cxh  
这篇文章主要介绍了如何在Java中MySQL的加解密函数实现敏感字段存储,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

java通过mysql的加解密函数实现敏感字段存储

1.AES加解密工具类:

public class AESUtils {
 
    public static String encrypt(String password, String strKey) {
        try {
            SecretKey key = generateMySQLAESKey(strKey,"ASCII");
            Cipher cipher = Cipher.getInstance("AES");
            cipher.init(Cipher.ENCRYPT_MODE, key);
            byte[] cleartext = password.getBytes("UTF-8");
            byte[] ciphertextBytes = cipher.doFinal(cleartext);
            return new String(Hex.encodeHex(ciphertextBytes));
 
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        }
        return null;
    }
 
    public static String decrypt(String content, String aesKey){
        try {
            SecretKey key = generateMySQLAESKey(aesKey,"ASCII");
            Cipher cipher = Cipher.getInstance("AES");
            cipher.init(Cipher.DECRYPT_MODE, key);
            byte[] cleartext = Hex.decodeHex(content.toCharArray());
            byte[] ciphertextBytes = cipher.doFinal(cleartext);
            return new String(ciphertextBytes, "UTF-8");
 
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        } catch (DecoderException e) {
            e.printStackTrace();
        }
        return null;
    }
 
 
    public static SecretKeySpec generateMySQLAESKey(final String key, final String encoding) {
        try {
            final byte[] finalKey = new byte[16];
            int i = 0;
            for(byte b : key.getBytes(encoding))
                finalKey[i++%16] ^= b;
            return new SecretKeySpec(finalKey, "AES");
        } catch(UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
    }
 
    public static String getAesKey(){
        StringBuilder sb = new StringBuilder();
        Random random = new Random();
        for(int i = 0; i < 16; i++){
            sb.append(random.nextInt(10));
        }
        return sb.toString();
    }
 
   public static void main(String[] args){
       String abc = "1";
       String aeskey = "3532263592381276";
       String a1= encrypt(abc, aeskey);
       System.out.println("加密后:" + a1);
       System.out.println("解密后:" +decrypt(a1, aeskey));
   }
 
   
}

运行main方法结果:

加密后:62b778a8ccaa40cce4c9e4e42c693665
解密后:1

2.mysql的sql加解密:

生成16随机盐:3532263592381276

select  concat((SELECT CEILING(RAND()*9000000000000000+1000000000000000)),'');

加密:62B778A8CCAA40CCE4C9E4E42C693665

SELECT (HEX(AES_ENCRYPT(1,"3532263592381276")))

解密:1

SELECT AES_DECRYPT(UNHEX("62B778A8CCAA40CCE4C9E4E42C693665"),"3532263592381276")

3.实现效果:

java工具类加解密和mysql的加解密效果是一样的。

知识点补充

mysql下的加密函数有如下几个

PASSWORD():创建一个经过加密的密码字符串,适合于插入到MySQL的安全系

统。该加密过程不可逆,和unix密码加密过程使用不同的算法。主要用于MySQL的认证系统。

ENCRYPT(,):使用UNIX crypt()系统加密字符串,ENCRYPT()函数接收要加密的字符串和(可选的)用于加密过程的salt(一个可以唯一确定口令的字符串,就像钥匙一样),注意,windows上不支持

ENCODE(,)   DECODE(,):加密解密字符串。该函数有两个参数:被加密或解密的字符串和作为加密或解密基础的密钥。Encode结果是一个二进制字符串,以BLOB类型存储。加密成都相对比较弱

MD5():计算字符串的MD5校验和(128位)

SHA5():计算字符串的SHA5校验和(160位)

以上两个函数返回的校验和是16进制的,适合与认证系统中使用的口令。

到此这篇关于Java通过MySQL的加解密函数实现敏感字段存储的文章就介绍到这了,更多相关Java敏感字段存储内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入解析Java设计模式编程中观察者模式的运用

    深入解析Java设计模式编程中观察者模式的运用

    这篇文章主要介绍了Java设计模式编程中观察者模式的运用,观察者模式主要是为了将对象进行与被观察者一样的实现,需要的朋友可以参考下
    2016-02-02
  • IDEA配置Maven教程的超详细讲解版

    IDEA配置Maven教程的超详细讲解版

    IntelliJ IDEA是当前最流行的Java IDE(集成开发环境)之一,也是业界公认最好用的Java开发工具之一,这篇文章主要给大家介绍了关于IDEA配置Maven教程的超详细讲解版,需要的朋友可以参考下
    2023-11-11
  • Spring启动时实现初始化的几种方案

    Spring启动时实现初始化的几种方案

    这篇文章主要介绍了Spring启动时实现初始化的几种方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • IDEA连接Mysql数据库的详细图文教程

    IDEA连接Mysql数据库的详细图文教程

    项目开发时使用Intellij IDEA连接本地数据库,将数据库可视化,还可对数据库表直接进行增删改查操作,方便快捷又清晰,下面这篇文章主要给大家介绍了关于IDEA连接Mysql数据库的详细图文教程,需要的朋友可以参考下
    2023-03-03
  • java  Iterator接口和LIstIterator接口分析

    java Iterator接口和LIstIterator接口分析

    这篇文章主要介绍了java Iterator接口和LIstIterator接口分析的相关资料,需要的朋友可以参考下
    2017-05-05
  • IDEA 2020.1 for Mac 下载安装配置及出现的问题小结

    IDEA 2020.1 for Mac 下载安装配置及出现的问题小结

    这篇文章主要介绍了IDEA 2020.1 for Mac 下载安装配置及出现的问题小结,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • SpringBoot 整合 Elasticsearch 实现海量级数据搜索功能

    SpringBoot 整合 Elasticsearch 实现海量级数据搜索功能

    这篇文章主要介绍了SpringBoot 整合 Elasticsearch 实现海量级数据搜索,本文主要围绕 SpringBoot 整合 ElasticSearch 接受数据的插入和搜索使用技巧,在实际的使用过程中,版本号尤其的重要,不同版本的 es,对应的 api 是不一样,需要的朋友可以参考下
    2022-07-07
  • Java文件断点续传实现原理解析

    Java文件断点续传实现原理解析

    这篇文章主要介绍了Java文件断点续传实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • java文件操作输入输出结构详解

    java文件操作输入输出结构详解

    这篇文章主要介绍了java文件操作输入输出详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-07-07
  • Java中replace的用法实例讲解

    Java中replace的用法实例讲解

    这篇文章主要给大家介绍了关于Java中replace用法的相关资料,Java中的replace方法是用于字符串替换的方法,它可以接受两个参数,第一个参数是需要被替换的字符串,第二个参数是替换后的字符串,需要的朋友可以参考下
    2024-04-04

最新评论