mysql实现内容加密_简单为mysql 实现透明加密方法
一般用戶在數(shù)據(jù)庫(kù)中保存數(shù)據(jù),雖然數(shù)據(jù)庫(kù)存儲(chǔ)的是二進(jìn)制,無(wú)法直接明文打開(kāi)查看,但是如果是一個(gè)外行人,直接連接進(jìn)入mysql中,還是可以直接查看數(shù)據(jù)的。
所以對(duì)于一些核心數(shù)據(jù),特別是企業(yè)重要數(shù)據(jù)資產(chǎn),一般會(huì)再增加一個(gè)透明加密的數(shù)據(jù)安全保護(hù),以避免一些無(wú)關(guān)人員直接獲取重要信息。
在O記里,就有專門的透明加密的功能模塊,叫做Oracle Key Manager,感興趣的童鞋可以去研究一下。
眾所周知,mysql 在互聯(lián)網(wǎng)里使用得非常多,除了它的性能確實(shí)不錯(cuò)外,免費(fèi)也是一個(gè)重要原因。但是免費(fèi)就代表著不講究,對(duì)于一些重要的企業(yè)功能,它沒(méi)有,你也不能夠說(shuō)啥,畢竟O記也為大家提供商業(yè)版本。
所以在MySQL 中,是不具備透明加密功能的。雖然如此,但是mysql 具備加密/解密的基礎(chǔ)功能啊,還有函數(shù)和觸發(fā)器,無(wú)論環(huán)境多么惡劣,只要想做成一件事,總有方法來(lái)實(shí)現(xiàn),人民群眾是歷史的創(chuàng)造者。
---- 分割線??----
首先為了避免加密 和 解密的 key 直接暴露,我們先創(chuàng)造一張表來(lái)保存這個(gè)key 值。
--配置一個(gè)保存 加/解 密 key 的表,并且提前準(zhǔn)備一個(gè)key 值
create table tkey (keyname varchar(100));insert into tkey values ('sequoiadb');
創(chuàng)建一張測(cè)試表,避免后面的觸發(fā)器無(wú)法創(chuàng)建
--測(cè)試表,驗(yàn)證加密和解密效果
drop table if existstest;create table test (id int, name varchar(100));
創(chuàng)建insert 和 update 的觸發(fā)器,觸發(fā)器只針對(duì) test.name 字段進(jìn)行加密保存,對(duì) test.id 字段不做處理。如果大家在業(yè)務(wù)里想做得更加復(fù)雜,肯定需要包裝一層配置方式,這里只介紹如何實(shí)現(xiàn)
--insert的 觸發(fā)器,只針對(duì) test.name 字段進(jìn)行加密保存
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 觸發(fā)器,只針對(duì) test.name 字段進(jìn)行加密更新
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 ;
創(chuàng)建一個(gè)解密的函數(shù),主要是為了在查詢時(shí),更加友好
--解密 函數(shù)
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 的透明加密和 解密動(dòng)作了,我們來(lái)驗(yàn)證一下
--驗(yàn)證sql,可以通過(guò)普通查詢和解密查詢,看看數(shù)據(jù)是否真的被自動(dòng)加密了
truncate tabletest;insert into test values (1,'sdb');insert into test values (2, 'sequoiadb');--普通查詢,得到的結(jié)果是一堆亂碼
select * fromtest;--解密查詢,返回預(yù)期結(jié)果
select id, decrypt(name) fromtest;update test set name = 'jushan' where id = 1;--解密查詢
select id, decrypt(name) from test where id = 1;
我自己測(cè)試的結(jié)果截圖:
*** 分割線 ***
上面的例子是結(jié)合了觸發(fā)器和函數(shù),對(duì)于復(fù)雜的業(yè)務(wù)系統(tǒng),可能會(huì)在運(yùn)維時(shí)造成影響,所以這里再提供一個(gè)只使用函數(shù)的方式,實(shí)現(xiàn)數(shù)據(jù)的加密和解密
創(chuàng)建 密鑰表
create table tkey (keyname varchar(100));insert into tkey values ('sequoiadb');
創(chuàng)建 測(cè)試表
create table test (id int, name varchar(100));
創(chuàng)建加密函數(shù)(encrypt名稱和已有函數(shù)沖突,所以用了 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 ;
創(chuàng)建解密函數(shù)
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 ;
測(cè)試
truncate tabletest;insert into test values (1, encrypt_new('abc'));select * fromtest;select id, decrypt_new(name) from test;
今天就介紹這些吧。
總結(jié)
以上是生活随笔為你收集整理的mysql实现内容加密_简单为mysql 实现透明加密方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 织梦地方php分类信息,织梦标签:inf
- 下一篇: matlab dfe 仿真,用matla