经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Oracle » 查看文章
Oracle自定义脱敏函数
来源:cnblogs  作者:九命猫幺  时间:2019/7/29 9:04:39  对本文有异议

对于信息安全有要求的,在数据下发和同步过程中需要对含有用户身份信息的敏感字段脱敏,包括用户姓名、证件号、地址等等,下面是自定义函数的代码

  1. CREATE OR REPLACE FUNCTION F_GET_SENSITIVE(IN_STR VARCHAR, IN_TYPE NUMBER)
  2. RETURN VARCHAR2 IS
  3. V_STR_LENGTH NUMBER;
  4. V_NAME VARCHAR2(1000);
  5. V_N NUMBER;
  6. V_HID VARCHAR2(200);
  7. V_SQL VARCHAR2(200);
  8. V_NUM_FLAG NUMBER;
  9. /****
  10. N_TYPE 脱敏字段类型
  11. 1 :名称
  12. 11:地址
  13. 2 :证件
  14. 3 :银行账号
  15. 4 :联系电话
  16. 5 :接入号码
  17. ***/
  18. BEGIN
  19. V_STR_LENGTH := LENGTH(IN_STR);
  20. V_N := 0;
  21.  
  22. IF V_STR_LENGTH=0 THEN
  23. RETURN(NULL);
  24. END IF;
  25.  
  26. /**********名称和地址脱敏规则**********/
  27. IF IN_TYPE = 1 OR IN_TYPE=11 THEN
  28. IF V_STR_LENGTH = 2 OR V_STR_LENGTH = 3 THEN
  29. V_NAME := REGEXP_REPLACE(IN_STR, '(.)', '*', 2, 1);
  30. ELSIF V_STR_LENGTH < 2 THEN
  31. V_NAME :=IN_STR;
  32. ELSE
  33. WHILE V_N < V_STR_LENGTH / 2 LOOP
  34. V_N := V_N + 1;
  35. V_HID := V_HID || '*';
  36. END LOOP;
  37. V_NAME := SUBSTR(IN_STR, 0, V_STR_LENGTH / 2) || V_HID;
  38. END IF;
  39. RETURN(V_NAME);
  40. END IF;
  41. /**********证件脱敏规则**********/
  42. IF IN_TYPE = 2 THEN
  43. IF V_STR_LENGTH = 15 THEN
  44. V_NAME := SUBSTR(IN_STR, 0, 6) || '******' || SUBSTR(IN_STR, -3, 3);
  45. ELSIF V_STR_LENGTH = 18 THEN
  46. V_NAME := SUBSTR(IN_STR, 0, 6) || '********' || SUBSTR(IN_STR, -4, 4);
  47. ELSE
  48. WHILE V_N < V_STR_LENGTH / 3 LOOP
  49. V_N := V_N + 1;
  50. V_HID := V_HID || '*';
  51. END LOOP;
  52. V_NAME := SUBSTR(IN_STR, 0, V_STR_LENGTH / 3) || V_HID ||
  53. SUBSTR(IN_STR, -V_STR_LENGTH / 3, V_STR_LENGTH / 3);
  54. END IF;
  55. RETURN(V_NAME);
  56. END IF;
  57.  
  58. /**********银行账号脱敏规则**********/
  59. IF IN_TYPE = 3 THEN
  60. IF V_STR_LENGTH > 15 THEN
  61. V_NAME := SUBSTR(IN_STR, 0, 4) || '********' || SUBSTR(IN_STR, -4, 4);
  62. ELSE
  63. V_NAME :=IN_STR;
  64. END IF;
  65. RETURN(V_NAME);
  66. END IF;
  67. /**********联系电话脱敏规则**********/
  68. IF IN_TYPE = 4 THEN
  69. V_NAME := SUBSTR(IN_STR, 0, V_STR_LENGTH - 4) || '****';
  70. RETURN(V_NAME);
  71. END IF;
  72.  
  73. /**********接入号码脱敏规则**********/
  74. IF IN_TYPE = 5 THEN
  75. V_SQL := 'SELECT COUNT(1) FROM DUAL WHERE LENGTH(''' || IN_STR ||
  76. ''') = LENGTH(REGEXP_REPLACE(''' || IN_STR || ''', ''[^0-9]''))';
  77. EXECUTE IMMEDIATE V_SQL
  78. INTO V_NUM_FLAG;
  79.  
  80. IF V_NUM_FLAG = 1 AND (V_STR_LENGTH = 7 OR V_STR_LENGTH = 8) THEN
  81. V_NAME := SUBSTR(IN_STR, 0, 2) || '****' || SUBSTR(IN_STR, -2, 2);
  82. ELSIF V_NUM_FLAG = 1 AND V_STR_LENGTH = 11 THEN
  83. V_NAME := SUBSTR(IN_STR, 0, 3) || '*****' || SUBSTR(IN_STR, -3, 3);
  84. ELSE
  85. V_NAME := IN_STR;
  86. END IF;
  87. RETURN(V_NAME);
  88. END IF;
  89. RETURN(IN_STR);
  90. EXCEPTION
  91. WHEN OTHERS THEN
  92. -- DBMS_OUTPUT.PUT_LINE('1'||V_SQL);
  93. V_NAME := '-1';
  94. RETURN V_NAME;
  95. END F_GET_SENSITIVE;
  96.  

原文链接:http://www.cnblogs.com/yongestcat/p/11250586.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号