
# 使用DSL加工函数对LTS日志数据脱敏
数据脱敏可以有效地减少敏感数据在加工、传输、使用等环节中的暴露，降低敏感数据泄露的风险，保护用户权益。本文介绍日志服务数据加工过程中常见的脱敏场景、对应的脱敏方法及示例。
#### 背景信息
使用敏感数据包括手机号、银行卡号、邮箱、IP地址、AK、身份证号、网址、订单号、字符串等场景中，您需要为敏感数据进行脱敏操作。在日志服务数据加工服务中，常见的脱敏方法有正则表达式替换（关键函数regex_replace）、Base64转码（关键函数base64_encoding）、MD5编码（关键函数md5_encoding）、str_translate映射（关键函数str_translate）等。更多信息，请参见[正则表达式函数](https://support.huaweicloud.com/usermanual-lts/lts_07_0153.html)和[编码解码函数](https://support.huaweicloud.com/usermanual-lts/lts_07_0150.html)。
#### 场景1：手机号脱敏
日志中包含不希望被暴露的手机号，可采用正则表达式，运用regex_replace函数脱敏。参考如下示例：
- 原始日志
  ```
  {
      "iphone":"13900001234"
  }
  ```
  
- 加工规则
  ```
  e_set(
      "sec_iphone",
      regex_replace(v("iphone"), r"(\d{0,3})\d{4}(\d{4})", replace=r"\1****\2"),
  )
  ```
  
- 加工结果
  ```
  {
  "sec_iphone": "139****1234",
  "iphone": 13900001234
  }
  ```
  
 
#### 场景2：银行卡信息脱敏
日志中包含银行卡或者信用卡信息，可采用正则表达式，运用regex_replace函数脱敏。
- 原始日志
  ```
  {
      "content":"bank number is 491648411333978312 and credit card number is 4916484113339780"
  }
  ```
  
- 加工规则
  ```
  e_set(
      "bank_number",
      regex_replace(
          v("content"), r"([1-9]{1})(\d{14}|\d{13}|\d{11})(\d{4})", replace=r"****\3"
      ),
  )
  ```
  
- 加工结果
  ```
  {
  "bank_number": "bank number is ****8312 and credit card number is ****9780",
  "content": "bank number is 491648411333978312 and credit card number is 4916484113339780"
  }
  ```
  
 
#### 场景3：邮箱地址脱敏
日志中包含邮箱信息，可采用正则表达式，运用regex_replace函数脱敏。
- 原始日志
  ```
  {
      "content":"email is username@example.com"
  }
  ```
  
- 加工规则
  ```
  e_set(
      "email_encrypt",
      regex_replace(
          v("content"),
          r"[A-Za-z\d]+([-_.][A-Za-z\d]+)*(@([A-Za-z\d]+[-.])+[A-Za-z\d]{2,4})",
          replace=r"****\2",
      ),
  )
  ```
  
- 加工结果
  ```
  {
  "content": "email is username@example.com",
  "email_encrypt": "email is ****@example.com"
  }
  ```
  
 
#### 场景4：AK脱敏
日志中包含AccessKey信息，可采用正则表达式，应用regex_replace函数。
- 原始日志
  ```
  {
      "content":"ak id is <testAccessKey ID> and ak key is <testAccessKey Secret>"
  }
  ```
  
- 加工规则
  ```
  e_set(
      "akid_encrypt",
      regex_replace(
          v("content"),
          r"([a-zA-Z0-9]{4})(([a-zA-Z0-9]{26})|([a-zA-Z0-9]{12}))",
          replace=r"\1****",
      ),
  )
  ```
  
- 加工结果
  ```
  {
  "akid_encrypt": "ak id is jdhc**** and ak key is Jkde****",
  "content": "ak id is <testAccessKey ID> and ak key is <testAccessKey Secret>"
  }
  ```
  
 
#### 场景5：IP地址脱敏
日志中包含IP地址信息，可同时运用regex_replace函数，对IP地址进行正则捕获后而脱敏。
- 原始日志
  ```
  {
      "content":"ip is 192.0.2.10"
  }
  ```
  
- 加工规则
  ```
  e_set("ip_encrypt",regex_replace(v('content'), r"((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])", replace=r"****"))
  ```
  
- 加工结果
  ```
  {
  "content": "ip is 2.0.2.10",
  "ip_encrypt": "ip is ****"
  }
  ```
  
 
#### 场景6：身份证脱敏
日志中包含身份证信息，可同时运用regex_replace函数，对身份证号进行正则捕获后而脱敏。
- 原始日志
  ```
  content: Id card is 111222190002309999
  ```
  
- 加工规则
  ```
  e_set(
      "id_encrypt", regex_replace(v("content"), r"\b\d{17}(\d|X)\b", replace=r"\1****")
  )
  ```
  
- 加工结果
  ```
  {
  "id_encrypt": "Id card is 9****",
  "content": "Id card is 111222190002309999"
  }
  ```
  
 
#### 场景7：网址脱敏
对日志内容中的网址做脱敏处理，并且将脱敏的数据转成明文格式，可运用Base64编码解码函数，对网址进行转码。
- 原始日志
  ```
  {
      "content":"https://www.huaweicloud.com/"
  }
  ```
  
- 加工规则
  ```
  e_set("base64_url",base64_encoding(v("content")))
  ```
  
- 加工结果
  ```
  {
  "base64_url": "aHR0cHM6Ly93d3cuaHVhd2VpY2xvdWQuY29tLw==",
  "content": "https://www.huaweicloud.com/"
  }
  ```
  ![](https://support.huaweicloud.com/bestpractice-lts/public_sys-resources/note_3.0-zh-cn.png)
  如果想对base64_url进行解码，可以使用base64_decoding(v("base64_url"))DSL语法规则。
  
 
#### 场景8：订单号脱敏
对日志内容中的订单号做脱敏处理，同时不希望其他人能够解码，可运用MD5编码函数，对订单号进行编码。
- 原始日志
  ```
  {
      "orderId": "20210101123456"
  }
  ```
  
- 加工规则
  ```
  e_set("md5_orderId",md5_encoding(v("orderId")))
  ```
  
- 加工结果
  ```
  {
  "orderId": 20210101123456,
  "md5_orderId": "9c0ab8e4d9f4eb6fbd5c508bbca05951"
  }
  ```
  
 
#### 场景9：字符串脱敏
若希望日志中的关键字符串不被暴露，可通过str_translate函数定义映射规则，对关键字符或字符串进行映射脱敏。
- 原始日志
  ```
  {
      "content": "message level is info_"
  }
  ```
  
- 加工规则
  ```
  e_set("data_translate", str_translate(v("content"),"aeiou","12345"))
  ```
  
- 加工结果
  ```
  {
  "data_translate": "m2ss1g2 l2v2l 3s 3nf4_",
  "content": "message level is info_"
  }
  ```
  
 
