Phát hiện và ẩn danh hóa dữ liệu cá nhân (PII) trước khi dùng Claude
Điểm nổi bật
Nhấn để đến mục tương ứng
- 1 Khi su dung Claude trong doanh nghiep, can luu y cac diem sau: Co so phap ly xu ly du lieu Theo Dieu 11, viec xu ly du lieu ca nhan phai co it nhat mot trong cac co so phap ly: su dong y cua chu the du lieu, thuc hien hop dong, nghia vu phap ly, hoac loi ich hop phap.
- 2 Khi gui du lieu vao Claude (ke ca API), ban dang "xu ly" du lieu ca nhan theo dinh nghia cua luat.
- 3 Phat hien PII bang Regex Regex (bieu thuc chinh quy) la cong cu co ban nhat de phat hien PII theo mau.
- 4 Cac ky thuat an danh hoa PII Sau khi phat hien PII, buoc tiep theo la an danh hoa.
- 5 Dinh nghia: Cac loai du lieu ca nhan theo ND13 3.
Dữ liệu cá nhân (Personally Identifiable Information — PII) là bất kỳ thông tin nào có thể xác định được một cá nhân cụ thể. Khi sử dụng Claude trong doanh nghiệp, việc gửi PII vào mô hình AI mà không có biện pháp bảo vệ là rủi ro pháp lý và đạo đức nghiêm trọng. Bài viết này hướng dẫn bạn xây dựng pipeline phát hiện và ẩn danh hóa PII trước khi gửi dữ liệu vào Claude, phù hợp với quy định pháp luật Việt Nam.
PII là gì và tại sao phải ẩn danh hóa?
PII bao gồm mọi thông tin có thể dùng để truy ngược lại một cá nhân cụ thể. Trong bối cảnh Việt Nam, các loại PII phổ biến bao gồm:
- CCCD/CMND: Số căn cước công dân 12 số hoặc chứng minh nhân dân 9/12 số
- Số điện thoại: Số di động 10 số bắt đầu bằng 0, hoặc có mã quốc gia +84
- Địa chỉ email: Email cá nhân hoặc email doanh nghiệp
- Mã số thuế (MST): 10 hoặc 13 số, dùng cho cá nhân và doanh nghiệp
- Số BHXH: Số bảo hiểm xã hội
- Địa chỉ nhà: Địa chỉ cụ thể đến số nhà, đường, phường/xã
- Họ và tên: Tên đầy đủ của cá nhân
- Ngày tháng năm sinh: Ngày sinh cụ thể
- Số tài khoản ngân hàng: Số tài khoản và tên ngân hàng
- Số hộ chiếu: Số hộ chiếu Việt Nam hoặc nước ngoài
Lý do phải ẩn danh hóa PII trước khi gửi vào Claude:
- Pháp lý: Nghị định 13/2023/NĐ-CP về bảo vệ dữ liệu cá nhân yêu cầu phải có cơ sở pháp lý khi xử lý dữ liệu cá nhân, bao gồm cả việc gửi cho bên thứ ba
- Bảo mật: Dù Claude không lưu trữ dữ liệu hội thoại (với API), việc gửi PII vẫn tạo rủi ro trong quá trình truyền tải
- Đạo đức: Tôn trọng quyền riêng tư của nhân viên, khách hàng và đối tác
- Kinh doanh: Lộ lọt dữ liệu cá nhân có thể gây tổn hại uy tín nghiêm trọng
Các mẫu PII đặc trưng của Việt Nam
Để xây dựng hệ thống phát hiện PII hiệu quả, trước tiên cần hiểu các định dạng PII đặc trưng tại Việt Nam.
Số CCCD (Căn cước công dân)
CCCD thẻ mới có 12 chữ số, trong đó 3 số đầu là mã tỉnh/thành phố, số thứ 4 là giới tính và thế kỷ sinh, 2 số tiếp là năm sinh, 6 số cuối là số định danh. Ví dụ: 001099012345.
Số điện thoại Việt Nam
Số điện thoại di động Việt Nam có 10 chữ số, bắt đầu bằng 0 (03x, 05x, 07x, 08x, 09x). Khi có mã quốc gia sẽ là +84 kèm 9 số còn lại. Số điện thoại cố định có mã vùng 2-3 số sau số 0.
Mã số thuế
MST cá nhân và doanh nghiệp có 10 chữ số. MST chi nhánh có 13 chữ số (10 số gốc + dấu gạch ngang + 3 số chi nhánh). Ví dụ: 0123456789 hoặc 0123456789-001.
Số BHXH
Số sổ bảo hiểm xã hội thường có 10 chữ số, bắt đầu bằng mã tỉnh. Định dạng có thể khác nhau tùy thời điểm cấp.
Phát hiện PII bằng Regex
Regex (biểu thức chính quy) là công cụ cơ bản nhất để phát hiện PII theo mẫu. Dưới đây là các regex pattern cho các loại PII Việt Nam phổ biến:
import re
# Cac regex pattern cho PII Viet Nam
PII_PATTERNS = {
'cccd': {
'pattern': r'd{12}',
'description': 'So CCCD 12 chu so',
'confidence': 'medium' # Can kiem tra them ngu canh
},
'cmnd': {
'pattern': r'd{9}',
'description': 'So CMND 9 chu so',
'confidence': 'low' # De nham voi so khac
},
'phone_vn': {
'pattern': r'(?:+84|0)(?:3[2-9]|5[2689]|7[06-9]|8[1-9]|9[0-9])d{7}',
'description': 'So dien thoai Viet Nam',
'confidence': 'high'
},
'email': {
'pattern': r'[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Z|a-z]{2,}',
'description': 'Dia chi email',
'confidence': 'high'
},
'mst': {
'pattern': r'd{10}(?:-d{3})?',
'description': 'Ma so thue 10 hoac 13 so',
'confidence': 'medium'
},
'bank_account': {
'pattern': r'd{8,19}',
'description': 'So tai khoan ngan hang',
'confidence': 'low' # Can ngu canh bo sung
},
'date_of_birth': {
'pattern': r'(?:0[1-9]|[12]d|3[01])[/-](?:0[1-9]|1[0-2])[/-](?:19|20)d{2}',
'description': 'Ngay thang nam sinh (dd/mm/yyyy)',
'confidence': 'medium'
}
}
def detect_pii(text):
"""Phat hien PII trong van ban"""
findings = []
for pii_type, config in PII_PATTERNS.items():
matches = re.finditer(config['pattern'], text)
for match in matches:
findings.append({
'type': pii_type,
'value': match.group(),
'position': match.span(),
'confidence': config['confidence'],
'description': config['description']
})
return findings
# Su dung
text = """
Ho so ung vien: Nguyen Van A
CCCD: 001099012345
SDT: 0912345678
Email: nguyenvana@gmail.com
MST: 0123456789
"""
results = detect_pii(text)
for r in results:
print(f"[{r['confidence'].upper()}] {r['description']}: {r['value']}")
Phát hiện PII nâng cao với Claude
Regex chỉ phát hiện được PII theo mẫu cố định. Nhiều loại PII không có mẫu rõ ràng như họ tên, địa chỉ, thông tin sức khỏe. Claude có thể giúp phát hiện các loại PII này thông qua hiểu ngữ cảnh.
Tuy nhiên, đây là nghịch lý: để Claude phát hiện PII, bạn phải gửi dữ liệu (có thể chứa PII) vào Claude. Giải pháp là sử dụng phương pháp 2 bước:
Bước 1: Lọc PII có mẫu bằng regex (phía client)
Sử dụng regex để phát hiện và ẩn danh hóa các PII có mẫu rõ ràng (số điện thoại, email, CCCD) trước khi gửi lên Claude.
Bước 2: Nhờ Claude phát hiện PII còn sót (với dữ liệu đã được lọc bước 1)
Sau khi đã ẩn danh hóa các PII có mẫu, gửi văn bản đã xử lý cho Claude để phát hiện các PII không có mẫu như tên người, địa chỉ, thông tin y tế.
Duoi day la van ban da duoc an danh hoa so dien thoai va email.
Hay kiem tra xem con thong tin ca nhan (PII) nao chua duoc
an danh hoa khong. Liet ke tat ca PII tim thay voi:
1. Loai PII (ten nguoi, dia chi, thong tin y te, v.v.)
2. Vi tri trong van ban
3. Muc do nghiem trong (Cao/Trung binh/Thap)
4. De xuat cach an danh hoa
Van ban can kiem tra:
[Dan van ban da loc buoc 1]
Luu y: Xet trong boi canh van hoa Viet Nam,
bao gom ca ten dia danh co the la PII khi ket hop
voi thong tin khac.
Các kỹ thuật ẩn danh hóa PII
Sau khi phát hiện PII, bước tiếp theo là ẩn danh hóa. Có nhiều kỹ thuật khác nhau, mỗi kỹ thuật phù hợp với tình huống cụ thể.
Masking (Che giấu)
Thay thế một phần hoặc toàn bộ PII bằng ký tự đặc biệt. Đây là kỹ thuật đơn giản nhất và phổ biến nhất.
- Số điện thoại: 0912345678 thành 091***5678
- Email: nguyenvana@gmail.com thành n*****a@gmail.com
- CCCD: 001099012345 thành 001099***345
Ưu điểm: Đơn giản, dễ hiểu, vẫn giữ được một phần thông tin để đối chiếu. Nhược điểm: Có thể bị suy ngược nếu ít dữ liệu.
Tokenization (Mã hóa thay thế)
Thay thế PII bằng một token (mã định danh) và lưu bảng ánh xạ (mapping table) riêng biệt. Token không có mối liên hệ toán học với dữ liệu gốc.
- Nguyễn Văn A thành [PERSON_001]
- 0912345678 thành [PHONE_TOKEN_A3F2]
- nguyenvana@gmail.com thành [EMAIL_TOKEN_B7C1]
Ưu điểm: Có thể khôi phục dữ liệu gốc khi cần (có bảng ánh xạ), bảo toàn cấu trúc văn bản. Nhược điểm: Cần bảo vệ bảng ánh xạ cẩn thận.
Pseudonymization (Giả danh)
Thay thế PII bằng dữ liệu giả nhưng có cùng định dạng. Kỹ thuật này hữu ích khi bạn cần dữ liệu trông thực tế để test hoặc phân tích.
- Nguyễn Văn A thành Trần Thị B
- 0912345678 thành 0987654321
- 001099012345 thành 079088098765
Ưu điểm: Dữ liệu giả trông giống dữ liệu thật, phù hợp cho testing và training. Nhược điểm: Phức tạp hơn, cần đảm bảo dữ liệu giả không trùng với dữ liệu thật của người khác.
Xây dựng Python pipeline ẩn danh hóa PII
Dưới đây là pipeline hoàn chỉnh kết hợp cả 3 kỹ thuật, cho phép bạn chọn phương pháp phù hợp cho từng loại PII:
import re
import hashlib
import json
from typing import Dict, List, Tuple
class PIIAnonymizer:
"""Pipeline an danh hoa PII cho van ban tieng Viet"""
def __init__(self, method='tokenize'):
self.method = method # 'mask', 'tokenize', 'pseudonymize'
self.token_map = {} # Luu bang anh xa token
self.counter = {} # Dem so luong token theo loai
def _mask(self, value: str, pii_type: str) -> str:
"""Che giau PII bang ky tu *"""
if pii_type == 'phone_vn':
return value[:3] + '***' + value[-4:]
elif pii_type == 'email':
local, domain = value.split('@')
return local[0] + '*' * (len(local) - 2) + local[-1] + '@' + domain
elif pii_type == 'cccd':
return value[:6] + '***' + value[-3:]
else:
mid = len(value) // 3
return value[:mid] + '***' + value[-mid:]
def _tokenize(self, value: str, pii_type: str) -> str:
"""Thay the PII bang token"""
if value in self.token_map:
return self.token_map[value]
self.counter[pii_type] = self.counter.get(pii_type, 0) + 1
token = f'[{pii_type.upper()}_{self.counter[pii_type]:03d}]'
self.token_map[value] = token
return token
def _pseudonymize(self, value: str, pii_type: str) -> str:
"""Thay the PII bang du lieu gia"""
hash_val = hashlib.md5(value.encode()).hexdigest()
if pii_type == 'phone_vn':
digits = ''.join(filter(str.isdigit, hash_val))[:9]
return '09' + digits[:8]
elif pii_type == 'email':
return f'user_{hash_val[:8]}@example.com'
elif pii_type == 'cccd':
digits = ''.join(filter(str.isdigit, hash_val))[:12]
return digits.ljust(12, '0')
else:
return f'[REDACTED_{hash_val[:6]}]'
def anonymize_text(self, text: str, patterns: Dict) -> Tuple[str, List]:
"""An danh hoa toan bo PII trong van ban"""
changes = []
anonymize_fn = {
'mask': self._mask,
'tokenize': self._tokenize,
'pseudonymize': self._pseudonymize
}[self.method]
# Sap xep theo vi tri giam dan de thay the tu cuoi len
all_matches = []
for pii_type, config in patterns.items():
for match in re.finditer(config['pattern'], text):
all_matches.append((match.start(), match.end(),
match.group(), pii_type))
all_matches.sort(key=lambda x: x[0], reverse=True)
result = text
for start, end, value, pii_type in all_matches:
replacement = anonymize_fn(value, pii_type)
result = result[:start] + replacement + result[end:]
changes.append({
'type': pii_type,
'original': value,
'replacement': replacement,
'position': (start, end)
})
return result, changes
def export_token_map(self, filepath: str):
"""Xuat bang anh xa token ra file (bao mat file nay)"""
with open(filepath, 'w', encoding='utf-8') as f:
json.dump(self.token_map, f, ensure_ascii=False, indent=2)
# Su dung pipeline
anonymizer = PIIAnonymizer(method='tokenize')
text = """
Bao cao nhan su thang 3:
- Nguyen Van A (CCCD: 001099012345, SDT: 0912345678)
Email: nguyenvana@gmail.com, MST: 0123456789
- Tran Thi B (CCCD: 079088098765, SDT: 0987654321)
Email: tranthib@company.vn, MST: 9876543210
"""
anonymized_text, changes = anonymizer.anonymize_text(text, PII_PATTERNS)
print("Van ban da an danh hoa:")
print(anonymized_text)
print(f"
Tong cong {len(changes)} PII da duoc an danh hoa")
Kiểm tra tính đầy đủ của việc ẩn danh hóa
Sau khi ẩn danh hóa, cần kiểm tra xem còn sót PII nào không. Đây là bước quan trọng mà nhiều tổ chức bỏ qua.
Kiểm tra tự động
Chạy lại regex scan trên văn bản đã ẩn danh hóa. Nếu vẫn tìm thấy PII, quy trình cần được xem xét lại.
Kiểm tra bằng Claude
Gửi văn bản đã ẩn danh hóa cho Claude để kiểm tra lần cuối:
Toi da an danh hoa van ban sau day. Hay kiem tra xem
con thong tin ca nhan nao chua duoc an danh hoa khong.
Dac biet chu y den:
- Ten nguoi (ho va ten Viet Nam)
- Dia chi cu the (so nha, ten duong, phuong/xa)
- Thong tin suc khoe
- Thong tin tai chinh ca nhan
- Bat ky thong tin nao co the suy ra danh tinh ca nhan
khi ket hop voi nhau
Van ban:
[Dan van ban da an danh hoa]
Neu tim thay PII con sot, chi ro vi tri va de xuat
cach an danh hoa phu hop.
Kiểm tra suy diễn ngược (re-identification test)
Một số PII riêng lẻ không nguy hiểm, nhưng khi kết hợp lại có thể suy ra danh tính. Ví dụ: "Nam, 35 tuổi, làm ở phòng Kỹ thuật, quận Cầu Giấy" — dù không có tên nhưng có thể xác định được người cụ thể trong công ty nhỏ. Cần kiểm tra cả trường hợp này.
Tuân thủ Nghị định 13/2023/NĐ-CP
Nghị định 13/2023/NĐ-CP về bảo vệ dữ liệu cá nhân có hiệu lực từ ngày 01/07/2023 là văn bản pháp lý quan trọng nhất về bảo vệ PII tại Việt Nam. Khi sử dụng Claude trong doanh nghiệp, cần lưu ý các điểm sau:
Cơ sở pháp lý xử lý dữ liệu
Theo Điều 11, việc xử lý dữ liệu cá nhân phải có ít nhất một trong các cơ sở pháp lý: sự đồng ý của chủ thể dữ liệu, thực hiện hợp đồng, nghĩa vụ pháp lý, hoặc lợi ích hợp pháp. Khi gửi dữ liệu vào Claude (kể cả API), bạn đang "xử lý" dữ liệu cá nhân theo định nghĩa của luật.
Đánh giá tác động xử lý dữ liệu (DPIA)
Đối với các hoạt động xử lý dữ liệu quy mô lớn hoặc dữ liệu nhạy cảm, cần thực hiện Đánh giá tác động xử lý dữ liệu cá nhân (Data Protection Impact Assessment). Việc này bao gồm đánh giá rủi ro khi sử dụng AI để xử lý dữ liệu.
Thông báo và đồng ý
Nhân viên và khách hàng cần được thông báo về việc dữ liệu của họ có thể được xử lý bởi AI. Cần có chính sách riêng tư rõ ràng và cơ chế đồng ý phù hợp.
Hay giup toi soan chinh sach su dung AI (Claude) lien quan
den du lieu ca nhan cho cong ty, tuan thu Nghi dinh 13/2023.
Chinh sach can bao gom:
1. Pham vi ap dung: Ai phai tuan thu, ap dung cho du lieu nao
2. Dinh nghia: Cac loai du lieu ca nhan theo ND13
3. Nguyen tac xu ly: Khi nao duoc/khong duoc gui PII vao Claude
4. Quy trinh an danh hoa: Cac buoc bat buoc truoc khi su dung Claude
5. Trach nhiem: Ai chiu trach nhiem khi co vi pham
6. Xu ly su co: Quy trinh khi phat hien lo lot PII
7. Dao tao: Yeu cau dao tao cho nhan vien
8. Kiem tra: Tan suat va phuong phap kiem tra tuan thu
Cong ty co 50 nhan vien, hoat dong trong linh vuc
thuong mai dien tu, xu ly du lieu khach hang hang ngay.
Tích hợp pipeline vào quy trình làm việc
Pipeline PII không nên là bước thủ công mà cần được tích hợp vào quy trình làm việc tự động.
Tích hợp với Claude API
Tạo middleware xử lý PII trước khi gửi request đến Claude API. Mọi request sẽ tự động được scan và ẩn danh hóa trước khi gửi đi.
Tích hợp với hệ thống nội bộ
Khi xuất dữ liệu từ CRM, ERP hoặc hệ thống nhân sự để phân tích bằng Claude, chạy pipeline ẩn danh hóa như một bước trong quy trình xuất dữ liệu.
Giám sát liên tục
Thiết lập cảnh báo khi phát hiện PII trong các request gửi đến Claude API. Ghi log các sự kiện phát hiện PII để review định kỳ.
import anthropic
class SafeClaudeClient:
"""Wrapper cho Claude API voi PII protection"""
def __init__(self, api_key: str):
self.client = anthropic.Anthropic(api_key=api_key)
self.anonymizer = PIIAnonymizer(method='tokenize')
self.pii_log = []
def safe_message(self, user_message: str, **kwargs):
"""Gui message sau khi an danh hoa PII"""
# Buoc 1: Scan va an danh hoa PII
clean_message, changes = self.anonymizer.anonymize_text(
user_message, PII_PATTERNS
)
# Buoc 2: Ghi log neu phat hien PII
if changes:
self.pii_log.append({
'timestamp': datetime.now().isoformat(),
'pii_count': len(changes),
'pii_types': list(set(c['type'] for c in changes))
})
print(f"Canh bao: Da phat hien va an danh hoa "
f"{len(changes)} PII truoc khi gui")
# Buoc 3: Gui message da an danh hoa
response = self.client.messages.create(
model=kwargs.get('model', 'claude-sonnet-4-20250514'),
max_tokens=kwargs.get('max_tokens', 1024),
messages=[{"role": "user", "content": clean_message}]
)
return response
Bước tiếp theo
Ẩn danh hóa PII là bước quan trọng trong việc sử dụng Claude an toàn và tuân thủ pháp luật. Sau khi thiết lập pipeline, hãy tích hợp vào hệ thống RBAC để đảm bảo mọi người trong tổ chức đều tuân thủ quy trình. Khám phá thêm các hướng dẫn bảo mật tại Thư viện Nâng cao.
Bai viet co huu ich khong?
Bản quyền thuộc về tác giả. Vui lòng dẫn nguồn khi chia sẻ.







