【data masking】遮盖脱敏方式与替换脱敏方式的简单实现

一.【遮盖脱敏方式】

需求:将十位数字遮盖中间四位

实现一:substr方法(不可逆,脱敏前后等长)

代码:

select substr('1234567890',1,3)||'****'||substr('1234567890',-3) as masked from dual

效果:

1234567890->123****890

 

实现二:replace+substr(不可逆,脱敏前后等长) 

代码:

select replace('1234567890',substr('1234567890',4,4),'****') as masked from dual

效果:

1234567890->123****890

 

实现三:regexp_replace(不可逆,脱敏前后等长) 

代码:

select regexp_replace('0123456789','\w{4}','****',4,1,'i') as masked from dual;

效果:

1234567890->012****789

 

二.【替换脱敏方式】

需求:将字符串中字符替换成其asc码

实现一:utl_raw.cast_to_raw/utl_raw.cast_to_varchar2(可逆,脱敏前后不等长)

加密代码:

select utl_raw.cast_to_raw('1234567890') as masked from dual

效果:

1234567890->31323334353637383930

解密代码:

select utl_raw.cast_to_varchar2('31323334353637383930') as real from dual

效果:

31323334353637383930->1234567890

 

实现二:utl_i18n.string_to_raw/utl_i18n.raw_to_char(可逆,脱敏前后不等长)

加密代码:

select utl_i18n.string_to_raw('1234567890') as masked from dual;

效果:

1234567890->31323334353637383930

解密代码:

select utl_i18n.raw_to_char('31323334353637383930') from dual;

效果:

31323334353637383930->1234567890

 

实现三:translate(可逆,前后等长)

加密代码:

select translate('69547963','0123456789','abcdefghij') as masked from dual

效果:

69547963->gjfehjgd

解密代码:

select translate('gjfehjgd','abcdefghij','0123456789') as real from dual

效果:

gjfehjgd->69547963

 

三.【算法替换脱敏方式】

1.摘要算法
MD5(变长,不可逆)

定义:

复制代码
CREATE OR REPLACE FUNCTION MD5(passwd IN VARCHAR2)
RETURN VARCHAR2
IS
retval varchar2(32);
BEGIN
retval := utl_raw.cast_to_raw(DBMS_OBFUSCATION_TOOLKIT.MD5(INPUT_STRING => passwd)) ;
RETURN retval;
END;
/
复制代码

使用:

SQL> select MD5(1234) from dual;

MD5(1234)
--------------------------------------------------------------------------------
81DC9BDB52D04DC20036DBD8313ED055

 

2.对称加密算法DES(变长,可逆)

加密函数定义:

复制代码
create or replace function
encrypt_des(p_text varchar2, p_key varchar2) return varchar2 is
v_text varchar2(4000);
v_enc varchar2(4000);
raw_input RAW(128) ;
key_input RAW(128) ;
decrypted_raw RAW(2048);
begin
v_text := rpad( p_text, (trunc(length(p_text)/8)+1)*8, chr(0));
raw_input := UTL_RAW.CAST_TO_RAW(v_text);
key_input := UTL_RAW.CAST_TO_RAW(p_key);
dbms_obfuscation_toolkit.DESEncrypt(input => raw_input,key => key_input,encrypted_data =>decrypted_raw);
v_enc := rawtohex(decrypted_raw);
dbms_output.put_line(v_enc);
return v_enc;
end;
/
复制代码

使用:

SQL> select encrypt_des('abcdefg','1234567890') from dual;

ENCRYPT_DES('ABCDEFG','1234567890')
--------------------------------------------------------------------------------
83560CA9BEEDD88D

解密函数定义:

复制代码
create or replace function decrypt_des(p_text varchar2,p_key varchar2) return varchar2 is
v_text varchar2(2000); 
begin
dbms_obfuscation_toolkit.DESDECRYPT(input_string => UTL_RAW.CAST_TO_varchar2(p_text),key_string =>p_key, decrypted_string=> v_text);
v_text := rtrim(v_text,chr(0));
dbms_output.put_line(v_text);
return v_text;
end;
/
复制代码

使用:

SQL> select decrypt_des('83560CA9BEEDD88D','1234567890') from dual;

DECRYPT_DES('83560CA9BEEDD88D','1234567890')
--------------------------------------------------------------------------------
abcdefg

 

 

参考资料:

1. https://www.cnblogs.com/shanshanliu/p/6247761.html

2.https://blog.csdn.net/weixin_36408281/article/details/53380332

3.https://blog.csdn.net/weixin_42054155/article/details/98666341

4.https://www.cnblogs.com/buffercache/p/10209470.html

END

posted @   逆火狂飙  阅读(521)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
历史上的今天:
2020-03-07 你会Spring Cloud吗?
2020-03-07 【Canvas与旗帜】红黄光芒海军旗
2019-03-07 【Canvas与艺术】五角星光芒四射的效果展示
生当作人杰 死亦为鬼雄 至今思项羽 不肯过江东
点击右上角即可分享
微信分享提示