本文目录导读:

在 PHP 中实现数据假名化(Pseudonymization)通常涉及将敏感数据(如姓名、邮箱、手机号等)替换为假名或代名,同时保持数据的可用性和关联性,以下是几种常见的实现方法:
简单哈希假名化
<?php
// 使用哈希函数生成假名
function pseudonymizeHash($data, $salt = 'secret_salt') {
return hash('sha256', $data . $salt);
}
// 示例
$email = "user@example.com";
$pseudonym = pseudonymizeHash($email);
echo "原始邮箱: $email\n";
echo "假名: $pseudonym\n";
?>
可逆加密假名化
<?php
class Pseudonymizer {
private $encryptionKey;
public function __construct($key) {
$this->encryptionKey = $key;
}
// 加密假名化
public function encrypt($data) {
$cipher = "aes-256-cbc";
$ivlen = openssl_cipher_iv_length($cipher);
$iv = openssl_random_pseudo_bytes($ivlen);
$encrypted = openssl_encrypt($data, $cipher, $this->encryptionKey, 0, $iv);
return base64_encode($iv . $encrypted);
}
// 解密还原
public function decrypt($encryptedData) {
$cipher = "aes-256-cbc";
$data = base64_decode($encryptedData);
$ivlen = openssl_cipher_iv_length($cipher);
$iv = substr($data, 0, $ivlen);
$encrypted = substr($data, $ivlen);
return openssl_decrypt($encrypted, $cipher, $this->encryptionKey, 0, $iv);
}
}
// 使用示例
$pseudonymizer = new Pseudonymizer('my_secret_key_123');
$userData = [
'name' => '张三',
'email' => 'zhangsan@example.com',
'phone' => '13812345678'
];
// 假名化
$pseudonymized = [];
foreach ($userData as $key => $value) {
$pseudonymized[$key] = $pseudonymizer->encrypt($value);
}
print_r($pseudonymized);
// 还原
$original = [];
foreach ($pseudonymized as $key => $value) {
$original[$key] = $pseudonymizer->decrypt($value);
}
print_r($original);
?>
生成随机假名(不可逆)
<?php
function generatePseudonym($length = 10) {
// 生成随机假名
$characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$pseudonym = '';
for ($i = 0; $i < $length; $i++) {
$pseudonym .= $characters[rand(0, strlen($characters) - 1)];
}
return $pseudonym;
}
function generateEmailPseudonym() {
// 生成邮箱假名
$domains = ['example.com', 'test.org', 'demo.net'];
$localPart = generatePseudonym(8);
$domain = $domains[array_rand($domains)];
return $localPart . '@' . $domain;
}
// 使用示例
$users = ['张三', '李四', '王五'];
$pseudonymizedUsers = [];
foreach ($users as $name) {
$pseudonymizedUsers[$name] = generateEmailPseudonym();
}
print_r($pseudonymizedUsers);
?>
映射表方式(Tokenization)
<?php
class TokenizationPseudonymizer {
private $mappingTable = [];
private $reverseMappingTable = [];
public function pseudonymize($data) {
// 如果已经存在映射,返回现有假名
if (isset($this->mappingTable[$data])) {
return $this->mappingTable[$data];
}
// 生成新的假名
$pseudonym = $this->generateToken();
$this->mappingTable[$data] = $pseudonym;
$this->reverseMappingTable[$pseudonym] = $data;
return $pseudonym;
}
public function depseudonymize($pseudonym) {
return isset($this->reverseMappingTable[$pseudonym])
? $this->reverseMappingTable[$pseudonym]
: null;
}
private function generateToken() {
return 'user_' . uniqid() . '_' . bin2hex(random_bytes(8));
}
}
// 使用示例
$tokenizer = new TokenizationPseudonymizer();
$originalData = [
['name' => 'Alice', 'email' => 'alice@example.com'],
['name' => 'Bob', 'email' => 'bob@example.com']
];
$pseudonymized = [];
foreach ($originalData as $user) {
$pseudonymized[] = [
'name' => $tokenizer->pseudonymize($user['name']),
'email' => $tokenizer->pseudonymize($user['email'])
];
}
print_r($pseudonymized);
?>
综合假名化服务类
<?php
class DataPseudonymizer {
private $method;
private $key;
private $mappingTable = [];
public function __construct($method = 'hash', $key = null) {
$this->method = $method;
$this->key = $key ?: bin2hex(random_bytes(32));
}
public function pseudonymize($data, $type = 'generic') {
switch ($this->method) {
case 'hash':
return $this->hashPseudonym($data);
case 'encrypt':
return $this->encryptPseudonym($data);
case 'token':
return $this->tokenPseudonym($data);
case 'format':
return $this->formatPseudonym($data, $type);
default:
throw new Exception("未知假名化方法");
}
}
private function hashPseudonym($data) {
return hash('sha256', $data . $this->key);
}
private function encryptPseudonym($data) {
// 实现加密逻辑
$cipher = "aes-256-cbc";
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length($cipher));
$encrypted = openssl_encrypt($data, $cipher, $this->key, 0, $iv);
return base64_encode($iv . $encrypted);
}
private function tokenPseudonym($data) {
// 生成随机令牌
$token = bin2hex(random_bytes(16));
$this->mappingTable[$token] = $data;
return $token;
}
private function formatPseudonym($data, $type) {
// 根据数据类型生成格式化的假名
switch ($type) {
case 'email':
return $this->generateEmailPseudonym();
case 'phone':
return $this->generatePhonePseudonym();
case 'name':
return $this->generateNamePseudonym();
default:
return 'ANON_' . substr(md5($data . $this->key), 0, 10);
}
}
private function generateEmailPseudonym() {
$local = 'user_' . bin2hex(random_bytes(4));
return $local . '@pseudonymized.example';
}
private function generatePhonePseudonym() {
return '+1' . str_pad(rand(0, 9999999999), 10, '0', STR_PAD_LEFT);
}
private function generateNamePseudonym() {
$names = ['Alpha', 'Bravo', 'Charlie', 'Delta', 'Echo'];
return $names[array_rand($names)] . '_' . substr(bin2hex(random_bytes(4)), 0, 4);
}
}
// 使用示例
$pseudonymizer = new DataPseudonymizer('format');
$userData = [
'name' => '张三',
'email' => 'zhangsan@example.com',
'phone' => '13812345678'
];
foreach ($userData as $field => $value) {
$pseudonymized[$field] = $pseudonymizer->pseudonymize($value, $field);
}
print_r($pseudonymized);
?>
注意事项
- 安全性:确保使用强加密算法和安全密钥管理
- 一致性:同一个原始数据应该生成相同的假名(对于需要关联分析的场景)
- 容量:如果需要大量假名化处理,考虑性能优化
- 合规性:遵循GDPR等数据保护法规的要求
- 可逆性:根据需求选择是否需要能够还原原始数据
选择哪种方法取决于你的具体需求:
- 需要可逆性 → 使用加密方法
- 只需要关联性 → 使用哈希方法
- 需要完全匿名 → 使用随机生成方法