在编程中,数据脱敏可以通过多种方法实现,以下是一些常见的方法和示例代码:
数据屏蔽
使用星号(*)或其他字符替换敏感信息的一部分。
示例代码(Python):
```python
def mask_data(data, start, end):
return data[:start] + '*' * (end - start) + data[end:]
phone = "13812345678"
masked_phone = mask_data(phone, 3, 7)
print(masked_phone) 输出: 1385678
```
数据替换
用假数据替换真实信息。
示例代码(SQL):
```sql
SELECT REPLACE(SUBSTRING('13812345678', 1, 3), SUBSTRING('13812345678', 4, 4), '') AS masked_phone;
```
数据加密
对数据进行加密,只有持有密钥的人才能解密和查看数据。
示例代码(Python):
```python
from cryptography.fernet import Fernet
key = Fernet.generate_key()
cipher_suite = Fernet(key)
data = "sensitive data"
encrypted_data = cipher_suite.encrypt(data.encode())
print(encrypted_data)
```
数据打乱
将数据的顺序搅乱。
示例代码(Python):
```python
import random
data = "1234567890"
shuffled_data = ''.join(random.sample(data, len(data)))
print(shuffled_data)
```
使用特定函数进行脱敏
可以使用 `REPLACE` 和 `SUBSTRING` 函数结合来实现各种脱敏效果。
示例代码(SQL):
```sql
SELECT REPLACE(SUBSTRING('13812345678', 1, 3), SUBSTRING('13812345678', 4, 4), '') AS masked_phone;
```
使用装饰器进行数据脱敏
通过创建自定义装饰器,可以方便地对需要脱敏的数据进行处理。
示例代码(TypeScript):
```typescript
interface DesensitizationRule {
start: number; // 保留的前缀字符数量
end: number; // 保留的后缀字符数量
replaceChar: string; // 用于替换脱敏部分的字符
}
function desensitize(rule: DesensitizationRule) {
return function (target: any, propertyKey: string) {
let value: string | number;
if (value !== undefined) {
value = String(value);
const startIndex = value.slice(0, rule.start);
const endIndex = value.slice(rule.end);
const maskedValue = startIndex + rule.replaceChar.repeat(value.length - rule.start - rule.end) + endIndex;
target[propertyKey] = maskedValue;
}
};
}
```
使用AOP(面向切面编程)进行数据脱敏
在程序内部和接口数据返回时进行脱敏,但数据库不脱敏。
示例代码(Java):
```java
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Desensitizes {
String[] fields();
boolean exclude() default false;
Class<?>[] types() default {};
}
public class MobilePhoneDesensitizer {
public static void desensitize(Object value, DesensitizationRule rule) {
if (value != null && rule != null) {
String str = value.toString();
String maskedStr = str.substring(0, rule.start) + "" + str.substring(str.length() - rule.end);
if (!rule.exclude()) {
((Map } } } } ``` 这些方法可以根据具体的应用