好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Oracle自定义脱敏函数的代码详解

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

CREATE OR REPLACE FUNCTION F_GET_SENSITIVE(IN_STR VARCHAR , IN_TYPE NUMBER)

  RETURN VARCHAR2 IS

  V_STR_LENGTH NUMBER;

  V_NAME    VARCHAR2(1000);

  V_N     NUMBER;

  V_HID    VARCHAR2(200);

  V_SQL    VARCHAR2(200);

  V_NUM_FLAG  NUMBER;

  /****

  N_TYPE 脱敏字段类型

  1 :名称

  11:地址

  2 :证件

  3 :银行账号

  4 :联系电话

  5 :接入号码

  ***/

BEGIN

  V_STR_LENGTH := LENGTH(IN_STR);

  V_N     := 0;

  IF V_STR_LENGTH=0 THEN

    RETURN ( NULL );

  END IF;

  /**********名称和地址脱敏规则**********/

  IF IN_TYPE = 1 OR IN_TYPE=11 THEN

   IF V_STR_LENGTH = 2 OR V_STR_LENGTH = 3 THEN

    V_NAME := REGEXP_REPLACE(IN_STR, '(.)' , '*' , 2, 1);

   ELSIF V_STR_LENGTH < 2 THEN

    V_NAME :=IN_STR;

   ELSE

    WHILE V_N < V_STR_LENGTH / 2 LOOP

     V_N  := V_N + 1;

     V_HID := V_HID || '*' ;

    END LOOP;

    V_NAME := SUBSTR(IN_STR, 0, V_STR_LENGTH / 2) || V_HID;

   END IF;

   RETURN (V_NAME);

  END IF;

  /**********证件脱敏规则**********/

  IF IN_TYPE = 2 THEN

   IF V_STR_LENGTH = 15 THEN

    V_NAME := SUBSTR(IN_STR, 0, 6) || '******' || SUBSTR(IN_STR, -3, 3);

   ELSIF V_STR_LENGTH = 18 THEN

    V_NAME := SUBSTR(IN_STR, 0, 6) || '********' || SUBSTR(IN_STR, -4, 4);

   ELSE

    WHILE V_N < V_STR_LENGTH / 3 LOOP

     V_N  := V_N + 1;

     V_HID := V_HID || '*' ;

    END LOOP;

    V_NAME := SUBSTR(IN_STR, 0, V_STR_LENGTH / 3) || V_HID ||

         SUBSTR(IN_STR, -V_STR_LENGTH / 3, V_STR_LENGTH / 3);

   END IF;

   RETURN (V_NAME);

  END IF;

  /**********银行账号脱敏规则**********/

  IF IN_TYPE = 3 THEN

   IF V_STR_LENGTH > 15 THEN

    V_NAME := SUBSTR(IN_STR, 0, 4) || '********' || SUBSTR(IN_STR, -4, 4);

   ELSE

    V_NAME :=IN_STR;

   END IF;

    RETURN (V_NAME);

  END IF;

  /**********联系电话脱敏规则**********/

  IF IN_TYPE = 4 THEN

   V_NAME := SUBSTR(IN_STR, 0, V_STR_LENGTH - 4) || '****' ;

   RETURN (V_NAME);

  END IF;

  /**********接入号码脱敏规则**********/

  IF IN_TYPE = 5 THEN

   V_SQL := 'SELECT COUNT(1) FROM DUAL WHERE LENGTH(' '' || IN_STR ||

        '' ') = LENGTH(REGEXP_REPLACE(' '' || IN_STR || '' ', ' '[^0-9]' '))' ;

   EXECUTE IMMEDIATE V_SQL

    INTO V_NUM_FLAG;

   IF V_NUM_FLAG = 1 AND (V_STR_LENGTH = 7 OR V_STR_LENGTH = 8) THEN

    V_NAME := SUBSTR(IN_STR, 0, 2) || '****' || SUBSTR(IN_STR, -2, 2);

   ELSIF V_NUM_FLAG = 1 AND V_STR_LENGTH = 11 THEN

    V_NAME := SUBSTR(IN_STR, 0, 3) || '*****' || SUBSTR(IN_STR, -3, 3);

   ELSE

    V_NAME := IN_STR;

   END IF;

    RETURN (V_NAME);

  END IF;

  RETURN (IN_STR);

EXCEPTION

  WHEN OTHERS THEN

   -- DBMS_OUTPUT.PUT_LINE('1'||V_SQL);

   V_NAME := '-1' ;

   RETURN V_NAME;

END F_GET_SENSITIVE;

总结

以上所述是小编给大家介绍的Oracle自定义脱敏函数的代码详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

原文链接:https://www.cnblogs.com/yongestcat/archive/2019/07/26/11250586.html

查看更多关于Oracle自定义脱敏函数的代码详解的详细内容...

  阅读:39次