前言
考虑到数据库层面的安全与加密,以及加密后不影响数据库的分析与使用。本文将介绍mysql下加密方式的实现
方式一
将字段属性设置为varbinary/binary/四个blob类型,等二进制字段属性。
create table user2
(
id int null,
username varbinary(200) null,
id_card varbinary(200) null
);
将username,id_card进行AES加密,密钥为key,存入表中
INSERT INTO user2 VALUES (1, AES_ENCRYPT('张三', 'key'), AES_ENCRYPT('360153411530193713', 'key'));
加密效果
![](http://cdn-img.sm-tc.cn/?src=l4uLj4zF0NCWkpjRlZ2FldGckJLQmZaTmqCWkp6YmozQno2LlpyTmtDNz83Lz87Qzc%2FNy8%2FOzcvPx8vJzM7N0Y%2BRmA%3D%3D&restype=3&from=derive&pi=&v=1)
查询的时候解密
select id, aes_decrypt(username,'key') as username,aes_decrypt(id_card,'key')as id_card from user2;
解密效果
![](http://cdn-img.sm-tc.cn/?src=l4uLj4zF0NCWkpjRlZ2FldGckJLQmZaTmqCWkp6YmozQno2LlpyTmtDNz83Lz87Qzc%2FNy8%2FOzcvPx8vJzM7M0Y%2BRmA%3D%3D&restype=3&from=derive&pi=&v=1)
方式二
将密文十六进制化,再存入varchar/char列。
此处需要用到HEX()来存入,用UNHEX()取出。
create table user
(
id int null,
username varchar(50) null,
id_card varchar(256) collate latin1_german1_ci null,
password varchar(60) null
);
将username,id_card进行加密存入,密匙123zxq
insert into user(id, username, id_card, password)
values (2, hex(aes_encrypt('李四', '123zxq')), hex(aes_encrypt('12057108241111', '123zxq')), 123456);
加密效果
![](http://cdn-img.sm-tc.cn/?src=l4uLj4zF0NCWkpjRlZ2FldGckJLQmZaTmqCWkp6YmozQno2LlpyTmtDNz83Lz87Qzc%2FNy8%2FOzcvPx8vJzM7L0Y%2BRmA%3D%3D&restype=3&from=derive&pi=&v=1)
解密
select id,AES_DECRYPT(UNHEX(username),'123zxq'),AES_DECRYPT(UNHEX(id_card),'123zxq') as id_card from user;
解密效果
![](http://cdn-img.sm-tc.cn/?src=l4uLj4zF0NCWkpjRlZ2FldGckJLQmZaTmqCWkp6YmozQno2LlpyTmtDNz83Lz87Qzc%2FNy8%2FOzcvPx8vJzM7K0Y%2BRmA%3D%3D&restype=3&from=derive&pi=&v=1)
总结
采用的AES的加密方式与java是一致的。
不过加密必然导致牺牲查询的性能,用了加密函数后,查询该字段,必定不走索引。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
最新评论