数据库加密AES 适用 Mysql Oracle 以及java

这篇具有很好参考价值的文章主要介绍了数据库加密AES 适用 Mysql Oracle 以及java。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

备忘录:加密key为:vU4C!~0_HQtlU_p@ 可采用任意长度为16位的字符串

数据库数据需要对敏感数据进行加密,比如手机号,身份证号以及银行卡号等进行加密。需要一套通用的加密方法可以在java项目以及oracle和mysql数据库中通用。于是在参考其他博主文件后有如下解决方案。此博客仅作为备忘录使用,并作技术交流。。


一、Mysql

加密:
SELECT to_base64(AES_ENCRYPT(‘4564879512346895654’,‘vU4C!~0_HQtlU_p@’));
解密:
SELECT AES_DECRYPT(from_base64(‘sQtqbsu/05NDCngxv/3al84bdzwtIFG91Zr6hZDpOvE=’),
‘vU4C!~0_HQtlU_p@’);
解密出来时blob文本如果想改成string可以使用如下解密语句
SELECT CONVERT(AES_DECRYPT(from_base64('sQtqbsu/05NDCngxv/3al84bdzwtIFG91Zr6hZDpOvE='),
'vU4C!~0_HQtlU_p@') USING utf8mb4) as field_value;

二、Oracle

1.赋予角色加密权限并创建函数

因为是oracle,所以首先得确定你使用的角色是否拥有加密数据的权限,否则无法使用DBMS_CRYPTO包。

oracle常用的权限查询指令

查看拥有权限的用户有哪些:
select * from dba_tab_privs where table_name = 'DBMS_CRYPTO' and owner = 'SYS';
执行以下sql:grant execute on sys.dbms_crypto to myuser;//myuser 是你oracle当前使用的角色

函数如下(示例):

-- 加密
create or replace FUNCTION FUN_ENCRYPTION(
V_STR VARCHAR2
)
RETURN VARCHAR2
AS
V_KEY_RAW RAW(16) ;
V_STR_RAW RAW(2000) ;
V_RETURN_STR VARCHAR2(2000) ;
V_TYPE PLS_INTEGER ;
BEGIN
	IF V_STR IS NULL OR V_STR = 'null' THEN 
	 BEGIN 
		 RETURN V_STR;
	 END;
	ELSE 
	 BEGIN 
		 V_KEY_RAW := UTL_I18N.STRING_TO_RAW('vU4C!~0_HQtlU_p@','UTF8') ;
         V_STR_RAW := UTL_I18N.STRING_TO_RAW(V_STR,'UTF8') ;
         V_TYPE := DBMS_CRYPTO.ENCRYPT_AES128+DBMS_CRYPTO.CHAIN_ECB+DBMS_CRYPTO.PAD_PKCS5 ;
         V_STR_RAW := DBMS_CRYPTO.ENCRYPT(SRC => V_STR_RAW , typ => V_TYPE, key => V_KEY_RAW) ;
         V_RETURN_STR := utl_raw.cast_to_varchar2(utl_encode.base64_encode(V_STR_RAW));
         RETURN V_RETURN_STR ;
	 END;
	END IF ;
END;
-- 解密
create or replace FUNCTION FUN_DECRYPTION(
V_STR VARCHAR2
)
RETURN VARCHAR2
AS
V_KEY_RAW RAW(16) ;
V_STR_RAW RAW(2000) ;
V_RETURN_STR VARCHAR2(2000) ;
V_TYPE PLS_INTEGER ;
BEGIN
	IF V_STR IS NULL OR V_STR = 'null' THEN 
	 BEGIN 
		 RETURN V_STR;
	 END;
	ELSE 
	 BEGIN 
		 V_KEY_RAW := UTL_I18N.STRING_TO_RAW('vU4C!~0_HQtlU_p@','UTF8') ;
         V_STR_RAW := utl_encode.base64_decode(utl_raw.cast_to_raw((V_STR)));
         V_TYPE := DBMS_CRYPTO.ENCRYPT_AES128+DBMS_CRYPTO.CHAIN_ECB+DBMS_CRYPTO.PAD_PKCS5 ;
         V_STR_RAW := DBMS_CRYPTO.DECRYPT(SRC => V_STR_RAW , typ => V_TYPE, key => V_KEY_RAW ) ;
         V_RETURN_STR := UTL_I18N.RAW_TO_CHAR(V_STR_RAW,'UTF8');
         RETURN V_RETURN_STR ;
	 END;
	END IF ;
END;

2.示例以及说明

sql如下(示例):

/**
 * 拥有对应权限项才能正常执行sql
**/
SELECT FUN_ENCRYPTION('4564879512346895654') FROM dual;
SELECT FUN_DECRYPTION('sQtqbsu/05NDCngxv/3al84bdzwtIFG91Zr6hZDpOvE=') FROM dual;

3.java程序代码以及对应说明

package com.fang.common.util;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;

/**
 * @Author LemonOvO
 * @Date 2022/8/31 10:10
 * @Version 1.0
 * @Description 对应的加密解密方法 适用项目是SpringBoot项目 加密key配置在Apollo中,若无配置可以
 * 使用静态常量写死在代码之中
 * @Project xxxx
 */
@Slf4j
@Component
public class AesEncoder {

    @Value("${database.encrypt.key:vU4C!~0_HQtlU_p@}")
    private void setsKey(String sKey) {
        AesEncoder.S_KEY = sKey;
    }

    private static String S_KEY;

    // 加密
    public static String encrypt(String sSrc) throws Exception {

        if(Utils.isBlank(sSrc)){
            return sSrc;
        }

        if (S_KEY == null) {
            System.out.print("Key为空null");
            return null;
        }
        // 判断Key是否为16位
        if (S_KEY.length() != 16) {
            System.out.print("Key长度不是16位");
            return null;
        }
        byte[] raw = S_KEY.getBytes(StandardCharsets.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(StandardCharsets.UTF_8));

        //此处使用BASE64做转码功能,同时能起到2次加密的作用。
        return new BASE64Encoder().encode(encrypted);
    }

    // 解密
    public static String decrypt(String sSrc) throws Exception {
        try {
            // 判断Key是否正确
            if (S_KEY == null) {
                System.out.print("Key为空null");
                return null;
            }
            // 判断Key是否为16位
            if (S_KEY.length() != 16) {
                System.out.print("Key长度不是16位");
                return null;
            }
            byte[] raw = S_KEY.getBytes(StandardCharsets.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 BASE64Decoder().decodeBuffer(sSrc);
            try {
                byte[] original = cipher.doFinal(encrypted1);
                return new String(original, StandardCharsets.UTF_8);
            } catch (Exception e) {
                log.error("数据库解密失败:", e);
                return null;
            }
        } catch (Exception ex) {
            log.error("数据库解密失败:", ex);
            return null;
        }
    }


    /**
     * 加密字符
     *
     * @param source 来源字符串   例:17799999999
     * @param begin  字符串加密开头保留的明文长度  例:3
     * @param end    字符串加密结尾处保留的明文长度  例:4
     * @return 加密后结果  例:177****9999
     */
    public static String encryptString(String source, Integer begin, Integer end) {
        if(Utils.isBlank(source)){
            return source;
        }
        int length = source.length();
        if (begin >= length) {
            return encryptRule(source);
        }
        if (begin < 0) {
            begin = 0;
        }
        if (end < 0) {
            end = 0;
        }
        char[] chars = source.toCharArray();
        char[] result = new char[chars.length];
        for (int i = 0; i < chars.length; i++) {
            if (i >= begin) {
                if (i >= (length - end)) {
                    result[i] = chars[i];
                } else {
                    result[i] = '*';
                }
            } else {
                result[i] = chars[i];
            }
        }
        String encrypt = String.valueOf(result);
        if (encrypt.contains("*")) {
            return encrypt;
        } else {
            return encryptRule(encrypt);
        }
    }

    private static String encryptRule(String source) {
        char[] chars = source.toCharArray();
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < chars.length; i++) {
            stringBuilder.append("*");
        }
        return stringBuilder.toString();
    }


    public static void main(String[] args) throws Exception {
        /*
         * 此处使用AES-128-ECB加密模式,key需要为16位。
         */
        String cKey = "GISQvI1Wk@@Lz7%?";
        // 需要加密的字串
        String cSrc = "zhangsan";
        System.out.println(cSrc);
        // 加密
        String enString = AesEncoder.encrypt(cSrc);
        System.out.println("加密后的字串是:" + enString);

        // 解密
        String deString = AesEncoder.decrypt(enString);
        System.out.println("解密后的字串是:" + deString);
    }
}


总结

参考文献地址:Mysql Oracle java 通用aes加密文章来源地址https://www.toymoban.com/news/detail-557947.html

到了这里,关于数据库加密AES 适用 Mysql Oracle 以及java的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据库去重(MYSQL和ORACLE)

    一、数据库中的去重操作(删除数据库中重复记录的SQL语句)主要有三种方法 (1)、rowid方法 (2)、group by 方法 (3)、distinct方法 1、用rowid方法 根据Oracle带的rowid属性,可以进行判断是否存在重复语句; (1)、查出表1和表2中name相同的数据 Select * from table1 a Where rowid !=

    2024年02月09日
    浏览(48)
  • Mysql中的对数据库字段的数据进行加密

    注意点:此处只对name字段进行了字段类型的修改。 ENCODE(\\\'123\\\',\\\'123\\\'): 第一个123:表示插入数据库中的数据(即将要被转换的数据) 第二个123:表示转换秘钥,可以任意起名。在解密的时候会需要用到。 结果: 注意点1 :此处DECODE的两个参数分别为 需要解密的内容(数据库中

    2024年02月09日
    浏览(69)
  • 从 Oracle 到 MySQL 数据库的迁移之旅

    目录 引言 一、前期准备工作 1.搭建新的MySQL数据库 2 .建立相应的数据表 2.1 数据库兼容性分析 2.1.1 字段类型兼容性分析 2.1.2 函数兼容性分析 2.1.3 是否使用存储过程?存储过程的个数?复杂度? 2.1.4 是否使用触发器?个数?使用的场景? 2.2 建表过程中其他需要注意的事项

    2024年04月11日
    浏览(53)
  • 查询Oracle和MySQL数据库中当前所有连接信息

    查询Oracle当前所有连接信息: 查询MySQL当前所有连接信息: 在这两个查询中,我为每个字段添加了中文别名,以提高查询结果的可读性

    2024年02月12日
    浏览(72)
  • docker安装mysql、clickhouse、oracle等各种数据库汇总

    1:docker 安装mongo数据库并使用 官网:https://www.mongodb.com/docs/manual/ mongo shell教程1:http://c.biancheng.net/mongodb2/connection.html 安装1 :https://www.zhihu.com/question/54602953/answer/3047452434?utm_id=0 安装2:https://www.duidaima.com/Group/Topic/ArchitecturedDesign/9182 使用驱动进行java开发:https://mongodb.github.

    2024年02月10日
    浏览(53)
  • DataGrip连接数据库设置(MySQL、Oracle、SQL Server)

    1.1 配置信息 1.2 测试查询employees库中departments表信息 employees为测试库,具体来源,参考这篇文章 下载并导入MySQL示例数据库employees 。 1.3 测试查询employees库中employees表信息 将SID改为orcl: 3.1 打开DG后新建Data Source-Microsoft SQL Server 下载驱动文件后按图中配置: 3.2 开启Named Pipes和

    2024年02月12日
    浏览(50)
  • 从MySQL迁移到Oracle数据库的详细步骤和方法

    在一些情况下,可能需要将现有的MySQL数据库迁移到Oracle数据库。本文将详细介绍如何进行这一迁移过程,涵盖了备份、转换和导入等关键步骤,以帮助你顺利完成数据库迁移。 在开始迁移之前,务必备份你的MySQL数据库,以便在出现问题时可以还原数据。 确保你已经安装了

    2024年02月08日
    浏览(55)
  • Spring Boot学习随笔- Jasypt加密数据库用户名和密码以及解密

    学习视频:【编程不良人】2021年SpringBoot最新最全教程 Jasypt 全称是Java Simplified Encryption,是一个开源项目。 Jasypt与Spring Boot集成,以便在应用程序的属性文件中加密敏感信息,然后在应用程序运行时解密这些信息。 可以使用 jasypt-spring-boot-starter 这个依赖项。从而实现属性源

    2024年02月04日
    浏览(69)
  • 使用Apache Doris自动同步整个 MySQL/Oracle 数据库进行数据分析

    Flink-Doris-Connector 1.4.0 允许用户一步将包含数千个表的整个数据库(MySQL或Oracle )摄取到Apache Doris(一种实时分析数据库)中。 通过内置的Flink CDC,连接器可以直接将上游源的表模式和数据同步到Apache Doris,这意味着用户不再需要编写DataStream程序或在Doris中预先创建映射表。

    2024年02月09日
    浏览(62)
  • 主流数据库(SQL Server、Mysql、Oracle)通过sql实现多行数据合为一行

    1、方法一:使用 STUFF 和 FOR XML PATH 进行多行合并成一行 (1)FOR XML PATH用法 FOR XML 是 SQL Server 提供的一种功能,允许您将查询结果转换为 XML 格式。 PATH 模式则是其中一种灵活的方式来构造自定义的XML结构。 1、基本字符串连接 : 当您想从单列中提取所有行的数据并连接成一

    2024年04月10日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包