MySQL数据加密

– 一、AES加密 双向加密 加密强度更高
AES_ENCRYPT(‘明文’,‘加密key’);
AES_DECRYPT(‘密文’,‘加密key’);

– username varchar类型, username2 blob类型
INSERT INTO t_gw_test(id,username2,username)
VALUES(2,AES_ENCRYPT(‘明文’,‘123’),HEX(AES_ENCRYPT(‘明文’,‘123’)));-- 加密存入
SELECT ID,AES_DECRYPT(UNHEX(username),‘123’),AES_DECRYPT(username2,‘123’) FROM t_gw_test;-- 解密取出

– blod转字符串
SELECT cast(username2 as char),username2 from t_gw_test;

– 二、普通加密 双向加密
ENCODE(‘明文’,‘加密key’);
DECODE(‘密文’,‘加密key’);

INSERT INTO t_gw_test VALUES(1,ENCODE(‘明文’,‘123’));-- 加密存入
SELECT ID,username,DECODE(username,‘123’) FROM t_gw_test;-- 解密取出

– 三、存储加密串的类型

– 1.将字段属性设置为varbinary/binary/四个blob类型,等二进制字段属性。
– 创建三个字段,属性分别为varbinary、binary、blob。
– BLOB类型的字段用于存储二进制数据 MySQL中,BLOB是个类型系列,
– 包括:TinyBlob、Blob、MediumBlob、LongBlob,这几个类型之间的唯一区别是在存储文件的最大大小上不同。
– MySQL的四种BLOB类型 类型 大小(单位:字节) TinyBlob 最大 255 Blob 最大 65K Medium。
– TinyBlob                             最大长度255个字元(2^8-1)  
– LongBlob                              最大长度4294967295个字元 (2^32-1)
– Blob                                    最大长度65535个字元(2^16-1)
– MediumBlob                         最大长度 16777215 个字元(2^24-1)

– 2.将密文十六进制化,再存入varchar/char列。
– 此处需要用到HEX()来存入,用UNHEX()取出。
– 创建一个字符串属性的字段。
– 将’hello world’先用密钥’key2’进行AES加密,再将加密后的串通过HEX函数十六进制化。
– 最后先将加密后的串通过UNHEX取出,再通过AES据密钥’key2’解密:
– MediumText                         最大长度 16777215 个字元(2^24-1
– TinyText                             最大长度255个字元(2^8-1)
– LongText                              最大长度4294967295个字元 (2^32-1)
– Text                                    最大长度65535个字元(2^16-1)

– 注意:varchar会有字符长度问题,长度不定的文本建议用Blod

– java在操作SQL做数据处理是可考虑两种方式

– 1.Hibernate注解对字段进行加密,运行时解密
– @ColumnTransformer(read = “CAST(AES_DECRYPT(字段名, ‘123’) as char(1000))”, write = “AES_ENCRYPT(?, ‘123’)” )
– AES_DECRYPT:解密,第一个参数为列名,第二个参数为密钥,解密之后在mysql中应该也是bolb所以需要加上CAST来强转为java可以直接接收的char类型

– 1、String 转 Blob:

– String content = “Hello World!”;

– Blob blob = Hibernate.createBlob(content.getBytes());

– 2、Blob 转 String:

– Blob blob;

– try{
– String content = new String(blob.getBytes((long)1, (int)blob.length()));
– } catch(SQLException e) {
– e.printStackTrace();
– }

– 2.原生SQL操作

你可能感兴趣的:(MySQL,数据库)