mysql实现内容加密_简单为mysql 实现透明加密方法

一般用户在数据库中保存数据,虽然数据库存储的是二进制,无法直接明文打开查看,但是如果是一个外行人,直接连接进入mysql中,还是可以直接查看数据的。

所以对于一些核心数据,特别是企业重要数据资产,一般会再增加一个透明加密的数据安全保护,以避免一些无关人员直接获取重要信息。

在O记里,就有专门的透明加密的功能模块,叫做Oracle Key Manager,感兴趣的童鞋可以去研究一下。

众所周知,mysql 在互联网里使用得非常多,除了它的性能确实不错外,免费也是一个重要原因。但是免费就代表着不讲究,对于一些重要的企业功能,它没有,你也不能够说啥,毕竟O记也为大家提供商业版本。

所以在MySQL 中,是不具备透明加密功能的。虽然如此,但是mysql 具备加密/解密的基础功能啊,还有函数和触发器,无论环境多么恶劣,只要想做成一件事,总有方法来实现,人民群众是历史的创造者。

456a68c26b209107efabfd80c48eb72a.png

---- 分割线  ----

首先为了避免加密 和 解密的 key 直接暴露,我们先创造一张表来保存这个key 值。

--配置一个保存 加/解 密 key 的表,并且提前准备一个key 值

create table tkey (keyname varchar(100));insert into tkey values ('sequoiadb');

创建一张测试表,避免后面的触发器无法创建

--测试表,验证加密和解密效果

drop table if existstest;create table test (id int, name varchar(100));

创建insert 和 update 的触发器,触发器只针对 test.name 字段进行加密保存,对 test.id 字段不做处理。如果大家在业务里想做得更加复杂,肯定需要包装一层配置方式,这里只介绍如何实现

--insert的 触发器,只针对 test.name 字段进行加密保存

drop trigger if existst_insert;

DELIMITER ;;create triggert_insert

beforeinsert ontestforeach rowbegin

select keyname into @key_name from tkey limit 1;set new.name = hex(AES_ENCRYPT(new.name, @key_name));end;;

DELIMITER ;--update 触发器,只针对 test.name 字段进行加密更新

drop trigger if existst_update;

DELIMITER ;;create triggert_update

beforeupdate ontestforeach rowbegin

select keyname into @key_name from tkey limit 1;set new.name = hex(AES_ENCRYPT(new.name, @key_name));end;;

DELIMITER ;

创建一个解密的函数,主要是为了在查询时,更加友好

--解密 函数

drop function if existsdecrypt;

DELIMITER ;;create function decrypt(col varchar(100))returns varchar(100) DETERMINISTICBEGIN

select keyname into @key_name from tkey limit 1;return AES_DECRYPT(unhex(col), @key_name);END;;

DELIMITER ;

这样就基本配置好了mysql 的透明加密和 解密动作了,我们来验证一下

--验证sql,可以通过普通查询和解密查询,看看数据是否真的被自动加密了

truncate tabletest;insert into test values (1,'sdb');insert into test values (2, 'sequoiadb');--普通查询,得到的结果是一堆乱码

select * fromtest;--解密查询,返回预期结果

select id, decrypt(name) fromtest;update test set name = 'jushan' where id = 1;--解密查询

select id, decrypt(name) from test where id = 1;

我自己测试的结果截图:

66f69a25d71958108c64ff7b8ac3538c.png

*** 分割线 ***

上面的例子是结合了触发器和函数,对于复杂的业务系统,可能会在运维时造成影响,所以这里再提供一个只使用函数的方式,实现数据的加密和解密

创建 密钥表

create table tkey (keyname varchar(100));insert into tkey values ('sequoiadb');

创建 测试表

create table test (id int, name varchar(100));

创建加密函数(encrypt名称和已有函数冲突,所以用了 encrypt_new)

DELIMITER ;;create function encrypt_new(col varchar(100))returns varchar(100) DETERMINISTICbegin

select keyname into @key_name from tkey limit 1;return hex(AES_ENCRYPT(col, @key_name));end;;

DELIMITER ;

创建解密函数

DELIMITER ;;create function decrypt_new(col varchar(100))returns varchar(100) DETERMINISTICBEGIN

select keyname into @key_name from tkey limit 1;return AES_DECRYPT(unhex(col), @key_name);END;;

DELIMITER ;

测试

truncate tabletest;insert into test values (1, encrypt_new('abc'));select * fromtest;select id, decrypt_new(name) from test;

今天就介绍这些吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/555315.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Arrays.sort() 的一些用法

Arrays.sort() 的一些用法 介绍 sort(T[] a)&#xff1a;对指定T型数组按数字升序排序。sort(T[] a,int formIndex, int toIndex)&#xff1a;对指定T型数组的指定范围按数字升序排序。sort(T[] a, Comparator<? supre T> c): 根据指定比较器产生的顺序对指定对象数组…

foreach 语法糖

// 源码 public class Test {public static void test1() {int[] arr {1, 2, 3, 4, 5};for (int i : arr) {System.out.println(i);}}public static void main(String[] args) {test1();} }// 反编译 public class Test {public Test() {}public static void test1() {int[] a…

DB2连接不上mysql数据库_一次DB2数据库连接失败(SQLSTATE=08001)的解决方法

有一次&#xff0c;在使用DbVisualizer工具连接自己linux虚拟机上的DB2数据库时&#xff0c;报如下错误&#xff1a;Product: DbVisualizer Pro 9.1Build: #2050 (2013/09/08 11:03)Java VM: Java HotSpot(TM)64-Bit Server VMJava Version:1.6.0_43Java Vendor: Sun Microsyst…

Java设置时间为0时0分0秒和23时59分59秒

Calendar calendar Calendar.getInstance(); // 0时0分0秒 calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0);// 23时59分59秒 calendar.set(Calendar.HOUR_OF_DAY, 23);…

mysql分片库分页查询_准备开发一个数据库分片的中间件,请问下分页查询用什么样的算法效率较高?...

假设你说的用户&#xff0c;不是开发人员&#xff0c;是终端用户&#xff0c;比如saas之类的系统用户。如果对于用户是透明的&#xff0c;意味着每个用户只需要看到自己的数据&#xff0c;那么比较经济的处理方式是&#xff0c;把用户id的哈希值作为分配的条件&#xff0c;这样…

Java之AQS(AbstractQueuedSynchronizer)

Java之AQS&#xff08;AbstractQueuedSynchronizer&#xff09; AQS 介绍 AQS 的全称为 AbstractQueuedSynchronizer &#xff0c;翻译过来的意思就是抽象队列同步器。这个类在 java.util.concurrent.locks 包下面。 ● 是用来实现锁或者其他同步器组件的公共基础部分的抽象实…

java中Arrays类的讲解

介绍 在java.util中有一个Arrays类&#xff0c;此类包含用于操纵数组的各种方法&#xff0c;例如&#xff1a;二分查找&#xff08;binarySearch&#xff09;、拷贝操作&#xff08;copyOf&#xff09;、比较(equals)、填充(fill)、排序&#xff08;sort&#xff09;等&#xf…

mysql 1055 解决方案_MySQL报错1055解决方案 - 树懒学堂

相信大家在使用MySQL数据库的过程中&#xff0c;或多或少都遇到报错。在mysql版本更新到5.7之后&#xff0c;有一个新的报错出现的次数越来越频繁&#xff0c;它就是MySQL 1055 报错。本文就给大家介绍一下MySQL 1055报错的原因以及解决的思路&#xff0c;并给出两种具体的解决…

SpringBoot 3.0最低版本要求的JDK 17,这几个新特性不能不知道

最近&#xff0c;有很多人在传说 SpringBoot要出3.0的版本了&#xff0c;并且宣布不再支持 Java 8&#xff0c;最低要求是 Java 17了。 其实&#xff0c;早在2021年9月份&#xff0c;关于 Spring Framework 6.0的消息出来的时候&#xff0c;Spring 官方就已经明确了不会向下兼…

jmeter mysql数据导出_Jmeter连接mysql

一、下载添加jar包image.png添加方法&#xff1a;1.拷贝到jmeter/lib目录下&#xff0c;此方法需重启jmeter2.直接在jmeter的测试计划中导入image.png二、连接mysql数据库添加配置元件-JDBC Connection Configurationimage.pngimage.png1.Variable Name for created pool&#…

判断一个坐标点是否在不规则多边形内部的算法

参考&#xff1a;https://wrf.ecse.rpi.edu//Research/Short_Notes/pnpoly.html 在GIS&#xff08;地理信息管理系统&#xff09;中&#xff0c;判断一个坐标是否在多边形内部是个经常要遇到的问题。乍听起来还挺复杂。根据W. Randolph Franklin 提出的PNPoly算法&#xff0c;…

cos7安装mysql_centos7 安装 mysql

centos7 安装 mysql1. 卸载MariaDB, centos 7 自带的[rootesbu-cos7-01 /]# rpm -qa|grep -i mariadb用命令卸载 rpm -e --nodeps2. 官网下载https://dev.mysql.com/downloads/mysql/5.7.html#downloads3. 解压 tar -xvf#tar -xvf mysql-5.7.22-1.el7.x86_64.rpm-bundle由于是…

MySQL中LIMIT的使用方法

一、任务描述 搜索表结构中的某些部分的数据&#xff0c;比如&#xff0c;最后面三个&#xff0c;最前面三个&#xff0c;第2到8条记录&#xff0c;等等。 二、实战演练 1、 select * from tablename order by orderfield desc/asc limit position&#xff0c; counter&#…

mysql++多版本安装_MySQL多版本多实例安装启动

多版本&#xff0c;大版本不同测试多实例&#xff0c;一个MySQL5.7.30一个MySQL8.0.20解压8.0tar -xvf mysql-8.0.20-linux-glibc2.12-x86_64.tartar -xJf mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz改名移动/mysql8.0.20mv mysql-8.0.20-linux-glibc2.12-x86_64 /mysql8.0.2…

MySQL数据库查询优化技巧

1.对查询进行优化&#xff0c;应尽量避免全表扫描&#xff0c;首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断&#xff0c;否则将导致引擎放弃使用索引而进行全表扫描&#xff0c;如&#xff1a; select id from t…

cheungssh mysql密码_CheungSSH安装及基本使用

CheungSSH比Ansible的使用更简单&#xff0c;尤其是配置方面&#xff01;而Ansible有的功能&#xff0c; 我的这个程序一样有&#xff0c;和Ansible一样是python开发&#xff0c; 所以跟Ansible的模式一样&#xff0c; 但是CheungSSH 操作更简单&#xff01;配置更轻量&#xf…

MySQL100万条数据的一张表,如何查询优化?

1.两种查询引擎查询速度&#xff08;myIsam 引擎 &#xff09; InnoDB 中不保存表的具体行数&#xff0c;也就是说&#xff0c;执行select count(*) from table时&#xff0c;InnoDB要扫描一遍整个表来计算有多少行。 MyISAM只要简单的读出保存好的行数即可。 注意的是&…

mysql增删改查操作语句_学习笔记-mysql增删改查操作语句

1.mysql增删改查操作语句&#xff1a;1)如果想在一个已经建好的表中添加一列&#xff0c;可以用以下代码&#xff1a;alter table t1 add column addr varchar(20) not null;2)这条语句会向已有的表t1中加入一列&#xff0c;这一列在表的最后一列位置。如果我们希望添加在指定的…

mybatis group by 分组查询:将返回结果封装为map

文章目录1. 最简单但性能最差的做法2. 使用group by分组查询&#xff0c;将查询结果封装成类3.group by分组查询&#xff0c;将结果封装为map。直接封装为map&#xff1f;List1. 最简单但性能最差的做法 在逻辑层分多次对数据库进行查询。伪代码如下。 List<String> na…

esl证明函 oracle_强弱分明 Astralis证明之战—ESL科隆B组浅析

HLTV排名前16名中的13支队伍(缺席的是G2和North)将齐聚这座坐落在莱茵河畔的城市进行厮杀&#xff0c;争夺比赛的最高荣誉。这项赛事也是继今年卡托维茨Major以来含金量最高&#xff0c;强队参赛最多的线下赛事。下面我们就来分析一下B组的出线形势。B组分组*本次比赛的赛制依旧…