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敏感字段存储内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 使用mybatis拦截器处理敏感字段

    目录 mybatis拦截器处理敏感字段 前言 思路解析 代码 趟过的坑(敲黑板重点) mybatis Excutor 拦截器的使用 这里假设一个场景 实现过程的关键步骤和代码 重点 mybatis拦截器处理敏感字段 前言 由于公司业务要求,需要在不影响已有业务上对 数据库中已有数据的敏感字段加密解密,个人解决方案利用mybatis的拦截器加密解密敏感字段 思路解析 利用注解标明需要加密解密的entity类对象以及其中的数据 mybatis拦截Executor.class对象中的query,upd

  • springboot实现敏感字段加密存储解密显示功能

    springboot实现敏感字段加密存储,解密显示,通过mybatis,自定义注解+AOP切面,Base64加解密方式实现功能. 1.代码实现: 创建springboot项目 添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <de

  • mybatis-plus 拦截器敏感字段加解密的实现

    目录 背景 一.查询拦截器 二.插入和更新拦截器 三.注解 背景 数据库在保存数据时,对于某些敏感数据需要脱敏或者加密处理,如果一个一个的去加显然工作量大而且容易出错,这个时候可以考虑使用拦截器,本文针对的是mybatis-plus作为持久层框架,其他场景未测试.代码如下: 一.查询拦截器 package com.sfpay.merchant.service.interceptor; import com.baomidou.mybatisplus.core.toolkit.CollectionU

  • Springboot AOP对指定敏感字段数据加密存储的实现

    前言 本文主要内容: 1. 插入数据 自定义注解方式  对 指定接口方法 的 参数的指定字段进行 加密存储: 2.对数据内的加密数据,进行解密返回 先看看效果 : 数据存入数据库表内, 手机号phone和邮箱email 属于敏感数据,我们需要密文存储 : 查询解密返回: 1.  自定义注解 加密标识注解  NeedEncrypt.java : import java.lang.annotation.*; /** * @Author JCccc * @Description 需加密 * @Date

  • 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.

  • MySql中的json_extract函数处理json字段详情

    目录 前言 1. 使用方式 2. 使用演示 3. 小结 前言 在db中存储json格式的数据,相信大家都或多或少的使用过,那么在查询这个json结构中的数据时,有什么好的方法么?取出String之后再代码中进行解析? 接下来本文将介绍一下Mysql5.7+之后提供的json_extract函数,可以通过key查询value值 1. 使用方式 数据存储的数据是json字符串,类型为我们常用的varchar即可 语法: JSON_EXTRACT(json_doc, path[, path] -) 若

  • asp base64加解密函数代码

    复制代码 代码如下: <% sBASE_64_CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" sBASE_64_CHARACTERS = strUnicode2Ansi(sBASE_64_CHARACTERS) Function strUnicodeLen(asContents) '计算unicode字符串的Ansi编码的长度 asContents1="a&q

  • 2个比较经典的PHP加密解密函数分享

    项目中有时我们需要使用PHP将特定的信息进行加密,也就是通过加密算法生成一个加密字符串,这个加密后的字符串可以通过解密算法进行解密,便于程序对解密后的信息进行处理. 最常见的应用在用户登录以及一些API数据交换的场景. 笔者收录了一些比较经典的PHP加密解密函数代码,分享给大家.加密解密原理一般都是通过一定的加密解密算法,将密钥加入到算法中,最终得到加密解密结果. 1.非常给力的authcode加密函数,Discuz!经典代码(带详解): 复制代码 代码如下: function authcode

  • Javascript C#真正可以交互的DES加解密代码

    因项目需要,要用js加密后,提交给C#解密, 在网上找了半天,网上有无数个版本,却找不到一个能互相使用的 甚至就连都是js版本的,都不能互通,汗一个. 因为时间关系,没有去深究加密代码,就随便下载了一个JS版本的, 并把它改写成C#版本的 这样JS加密后的结果,C#也能解密 反之C#加密后的结果,JS也能解密 我把它发出来给大家共享吧 注:源代码是VS.Net2008版本创建的,里面包含js的加解密函数和C#的加解密函数 如果你找到什么bug,或有啥好建议,不妨联系一下俺,呵呵: btw:在改写

  • java实现的RC4加密解密算法示例

    本文实例讲述了java实现的RC4加密解密算法.分享给大家供大家参考,具体如下: 有一个项目,需要解析一个用户提供的rc4加密后的文件,特意搜索整理了一个Java 版本的RC4加解密算法. public static String HloveyRC4(String aInput,String aKey) { int[] iS = new int[256]; byte[] iK = new byte[256]; for (int i=0;i<256;i++) iS[i]=i; int j = 1;

  • PHP封装的字符串加密解密函数

    程序中经常使用的PHP加密解密字符串函数 代码如下: /********************************************************************* 函数名称:encrypt 函数作用:加密解密字符串 使用方法: 加密 :encrypt('str','E','nowamagic'); 解密 :encrypt('被加密过的字符串','D','nowamagic'); 参数说明: $string :需要加密解密的字符串 $operation:判断是加密还

  • 密码系统AES私钥RSA公钥的加解密示例

    目录 前言 百科的诠释 java使用公私钥加解密的实例 前言 密钥是成对存在的,加密和解密是采用不同的密钥(公开密钥),也就是非对称密钥密码系统,每个通信方均需要两个密钥,即公钥和私钥,使用公钥进行加密操作,使用私钥进行解密操作.公钥是公开的,不需要保密,而私钥是由个人自己持有,并且必须妥善保管和注意保密.密码学里面博大精深,下面的实例仅供参考 百科的诠释 公钥(Public Key)与私钥(Private Key)是通过一种算法得到的一个密钥对(即一个公钥和一个私钥),公钥是密钥对中公开的部分

  • Java OpenSSL生成的RSA公私钥进行数据加解密详细介绍

    Java中使用OpenSSL生成的RSA公私钥进行数据加解密 RSA是什么:RSA公钥加密算法是1977年由Ron Rivest.Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的.RSA取名来自开发他们三者的名字.RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准.目前该加密方式广泛用于网上银行.数字签名等场合.RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困

  • 详细分析JAVA加解密算法

    加解密算法分析 日常开发中,无论你是使用什么语言,都应该遇到过使用加解密的使用场景,比如接口数据需要加密传给前端保证数据传输的安全:HTTPS使用证书的方式首先进行非对称加密,将客户端的私匙传递给服务端,然后双方后面的通信都使用该私匙进行对称加密传输:使用MD5进行文件一致性校验,等等很多的场景都使用到了加解密技术. 很多时候我们对于什么时候要使用什么样的加解密方式是很懵的.因为可用的加解密方案实在是太多,大家对加解密技术的类型可能不是很清楚,今天这篇文章就来梳理一下目前主流的加解密技术,本篇文

随机推荐