动态数据加密
动态加密(也称实时加密,透明加密等,其英文名为encrypt on-the-fly),是指数据在使用过程中自动对数据进行加密或解密操作,无需用户的干预,合法用户在使用加密的文件前,也不需要进行解密操作即可使用,表面看来,访问加密的文件和访问未加密的文件基本相同,对合法用户来说,这些加密文件是“透明的”,即好像没有加密一样,但对于没有访问权限的用户,即使通过其它非常规手段得到了这些文件,由于文件是加密的,因此也无法使用。
加密要求
基于不同的敏感字段,使用不用的加密算法
【2.1】姓名:两种脱敏方式:1)姓名有2位,脱敏第二位;大于2位,脱敏中间位。比如:张*,张三,张**三;
【2.2】身份证号码:屏蔽后6位,同时使用身份证号对应MD5码作为唯一性识别;
【2.3】军官证号码、护照号码:屏蔽中间3-6位,例如E0961;
身份证号码、军官证号码、护照号码:屏蔽后6位;
【2.4】手机号码:显示前3位++后4位
【2.5】固定电话:显示前4位++后2位
【2.6】电子邮箱:@前面3位+,@后面完整显示
【2.7】地址:显示前3位,后面全部显示
【2.8】微信OPENID:直接使用MD5转换
【2.9】银行卡卡号:显示前6+(实际位数)+后4位
【2.10】其他敏感数据(学历、婚姻状况等):*****
基于函数方式实现MySQL、Oracle数据库动态加密
MySQL 版本
示例图下:
DELIMITER $$
USE `db`$$
DROP FUNCTION IF EXISTS `f_encrypt`$$
CREATE FUNCTION `f_encrypt`(p_text VARCHAR(500),p_key INT) RETURNS VARCHAR(500) CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci
BEGIN
DECLARE result VARCHAR(500) DEFAULT '';
SET result = (CASE WHEN p_key = 0 THEN CASE WHEN CHAR_LENGTH(p_text)=1 THEN p_text
WHEN CHAR_LENGTH(p_text)=2 THEN CONCAT(SUBSTR(p_text,1,1),'*')
ELSE CONCAT(SUBSTR(p_text,1,1),REPEAT('*',CHAR_LENGTH(SUBSTR(SUBSTR(p_text,2,LENGTH(p_text)),1,CHAR_LENGTH(SUBSTR(p_text,2,LENGTH(p_text)))-1))),SUBSTR(p_text,-1,1))
END
WHEN p_key = 1 THEN INSERT(p_text,LENGTH(p_text)-5,6,'******')
WHEN p_key = 2 THEN CONCAT(SUBSTR(p_text,1,3),REPEAT('*',CHAR_LENGTH(SUBSTR(SUBSTR(p_text,4,CHAR_LENGTH(p_text)),1,CHAR_LENGTH(SUBSTR(p_text,4,CHAR_LENGTH(p_text)))-4))),SUBSTR(p_text,CHAR_LENGTH(p_text)-3,4))
WHEN p_key = 3 THEN CONCAT(SUBSTR(p_text,1,4),REPEAT('*',CHAR_LENGTH(SUBSTR(SUBSTR(p_text,5,CHAR_LENGTH(p_text)),1,CHAR_LENGTH(SUBSTR(p_text,5,CHAR_LENGTH(p_text)))-2))),SUBSTR(p_text,CHAR_LENGTH(p_text)-1,2))
WHEN p_key = 4 THEN INSERT(p_text,1,3,'***')
WHEN p_key = 5 THEN CONCAT(SUBSTR(p_text,1,3),REPEAT('*',CHAR_LENGTH(SUBSTR(p_text,4,LENGTH(p_text)))))
WHEN p_key = 6 THEN MD5(p_text)
WHEN p_key = 7 THEN CONCAT(SUBSTR(p_text,1,6),REPEAT('*',CHAR_LENGTH(SUBSTR(SUBSTR(p_text,7,CHAR_LENGTH(p_text)),1,CHAR_LENGTH(SUBSTR(p_text,7,CHAR_LENGTH(p_text)))-4))),SUBSTR(p_text,CHAR_LENGTH(p_text)-6,4))
WHEN p_key = 8 THEN SHA2(p_text,256)
WHEN p_key IS NULL THEN '******'
ELSE '******' END);
RETURN result;
END$$
DELIMITER ;
Oracle 版本
示例如下:
CREATE OR REPLACE FUNCTION MD5( passwd IN VARCHAR2) RETURN VARCHAR2
IS
retval varchar2(32);
BEGIN
retval := (case when passwd is null then null else utl_raw.cast_to_raw(DBMS_OBFUSCATION_TOOLKIT.MD5(INPUT_STRING => passwd)) end);
RETURN lower(retval);
END;
/
commit;
create or replace function f_encrypt(p_text varchar2, p_key int) return varchar2 is
v_enc varchar2(4000);
begin
v_enc := case when p_key =0 then case when length(p_text)=1 then p_text
when length(p_text)=2 then substr(p_text,1,1)||'*'
else substr(p_text,1,1)||lpad('*',length(substr(substr(p_text,2,length(p_text)),1,length(substr(p_text,2,length(p_text)))-1)),'*') || substr(p_text,-1,1) end
when p_key =1 then substr(p_text,1,length(p_text)-6)||'******'
when p_key =2 then substr(p_text,1,3)||'****'||substr(p_text,length(p_text)-3,length(p_text))
when p_key =3 then substr(p_text,1,4)||regexp_replace(substr(substr(p_text,1,length(p_text)-2),5,length(substr(p_text,1,length(p_text)-2))),'[0-9]','*')||substr(p_text,length(p_text)-1,length(p_text))
when p_key =4 then '***'||substr(substr(p_text,1,INSTRB(p_text,'@',1,1)-1),4,length(substr(p_text,1,INSTRB(p_text,'@',1,1)-1)))||substr(p_text,INSTRB(p_text,'@',1,1))
when p_key =5 then substr(p_text,1,3)|| rpad('*',length(p_text)-3,'*')
when p_key =6 then md5(p_text)
when p_key =7 then substr(p_text,1,6)||rpad('*',length(p_text)-10,'*')||substr(p_text,length(p_text)-3,length(p_text))
when p_key =8 then SHA256(p_text)
when p_key is NULL then '******'
else '******' end;
return v_enc;
end;