Java / MySQL 的 AES-128-ECB加密

使用 AES 加密数据库敏感信息

1、Java 工具类加解密

 
工具类 :

package com.pro.tx.util;

import org.apache.commons.codec.binary.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

/**
 * @author 
 * @title: AESUtil
 * @description: AES 加解密公共类 使用AES-128-ECB加密模式
 * @date 2019/7/11 19:43
 */
public class AESUtil {

    private static final Logger logger =
                    LoggerFactory.getLogger(AESUtil.class);

    /** AES 加解密密钥,请勿擅自修改!!! */
    private static final String key = "0000000000000000";


    /**
     * AES 加密 使用AES-128-ECB加密模式
     * @param sSrc  需要加密的字段
     * @param sKey  16 位密钥
     * @return
     * @throws Exception
     */
    public static String Encrypt(String sSrc, String sKey) {
        try {
            if (sKey == null) {
                logger.info("Key为空null");
                return null;
            }
            /** 判断Key是否为16位 */
            if (sKey.length() != 16) {
                logger.info("Key长度不是16位");
                return null;
            }
            byte[] raw = sKey.getBytes("utf-8");
            SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
            /** "算法/模式/补码方式" */
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
            byte[] encrypted = cipher.doFinal(sSrc.getBytes("utf-8"));
            /** 此处使用BASE64做转码功能,同时能起到2次加密的作用。 */
            return new Base64().encodeToString(encrypted);
        } catch (Exception e) {
           logger.info(sSrc + " AES解密异常!");
           e.printStackTrace();
           return null;
        }
    }

    public static String Encrypt(String sSrc) {
        return Encrypt(sSrc, key);
    }

    /**
     * AES 解密 使用AES-128-ECB加密模式
     * @param sSrc  需要解密的字段
     * @param sKey  16 位密钥
     * @return
     * @throws Exception
     */
    public static String Decrypt(String sSrc, String sKey) {
        try {
            // 判断Key是否正确
            if (sKey == null) {
                logger.info("Key为空null");
                return null;
            }
            // 判断Key是否为16位
            if (sKey.length() != 16) {
                logger.info("Key长度不是16位");
                return null;
            }
            byte[] raw = sKey.getBytes("utf-8");
            SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, skeySpec);
            /** 先用base64解密 */
            byte[] encrypted1 = new Base64().decode(sSrc);
            try {
                byte[] original = cipher.doFinal(encrypted1);
                String originalString = new String(original,"utf-8");
                return originalString;
            } catch (Exception e) {
                System.out.println(e.toString());
                return null;
            }
        } catch (Exception e) {
            logger.info(sSrc + " AES解密异常!");
            e.printStackTrace();
            return null;
        }
    }


    public static String Decrypt(String sSrc) {
        return Decrypt(sSrc, key);
    }

}

 
工具类加解密验证 :

在这里插入图片描述
 

2、MySQL 数据库函数加解密

 
说明 :

加密函数 : TO_BASE64(AES_ENCRYPT(str, key))

 
解密函数 : AES_DECRYPT(FROM_BASE64 (str),key)
 
str:需要加解密的字符串; key:必须为16wei秘钥,加解密的秘钥需保持一致。
 
TO_BASE6() 与 FROM_BASE64() 函数是解决加解密过程中,中文乱码的问题。

 
加密脚本测试 :
在这里插入图片描述

解密脚本测试 :
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值