Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

MySQL: ปิดบังข้อมูล (Masking) ด้วย CONCAT และ REPEAT

Data Masking: ซ่อนข้อมูล nhạy cảmด้วย CONCAT + SUBSTR + REPEAT

แสดงแค่ 5 ตัวอักษรแรก แล้วทับส่วนที่เหลือด้วย # (hash) โดยใช้ REPEAT('#', length - 5)

สร้างตารางและข้อมูล

mysql> create table DemoTable1410 (
    -> Password varchar(80)
    -> );
Query OK, 0 rows affected (0.51 sec)

mysql> insert into DemoTable1410 values('John12345678');
mysql> insert into DemoTable1410 values('Carol_897');
mysql> insert into DemoTable1410 values('David_5647383');

ข้อมูลต้นฉบับ

+---------------+
| Password      |
+---------------+
| John12345678  |
| Carol_897     |
| David_5647383 |
+---------------+

คำสั่ง UPDATE Masking

mysql> update DemoTable1410
    -> set Password = concat(substr(Password, 1, 5), repeat('#', char_length(Password) - 5));
Query OK, 3 rows affected (0.16 sec)

ข้อมูลหลัง Masking

+---------------+
| Password      |
+---------------+
| John1#######  |
| Carol####     |
| David######## |
+---------------+

อธิบายการทำงาน

  • substr(Password, 1, 5) — ดึง 5 ตัวแรก
  • char_length(Password) - 5 — คำนวณจำนวนตัวอักษรที่เหลือ
  • repeat('#', n) — สร้างสตริง # จำนวน n ตัว
  • concat(...) — รวมเข้าด้วยกัน

รูปแบบ Masking อื่นๆ

MySQL 8.0+: Data Masking Functions (Enterprise)

MySQL Enterprise Edition มี MASK_SSN(), MASK_CC(), MASK_EMAIL() built-in

แนวทางปฏิบัติที่ดี (Best Practice)

  1. ไม่เก็บข้อมูลจริงใน production — ใช้ hashing (bcrypt, argon2) สำหรับ password
  2. Masking เฉพาะการแสดงผล (View/Application layer) — ไม่ UPDATE จริงใน DB
  3. ใช้ View สำหรับ Masked Data:
    CREATE VIEW masked_users AS
    SELECT id, 
           CONCAT(SUBSTR(email,1,1), REPEAT('*', LENGTH(email)-INSTR(email,'@')-1), SUBSTR(email, INSTR(email,'@'))) AS email
    FROM users;
รูปแบบSQLตัวอย่าง (John12345678)
แสดง 4 ตัวแรก ทับท้ายCONCAT(SUBSTR(pwd,1,4), REPEAT('*', LENGTH(pwd)-4))John**********
แสดง 4 ตัวแรก 4 ตัวท้าย ทับกลางCONCAT(SUBSTR(pwd,1,4), REPEAT('*', LENGTH(pwd)-8), SUBSTR(pwd,-4))John****5678
Email maskingCONCAT(SUBSTR(email,1,1), REPEAT('*', LENGTH(email)-INSTR(email,'@')-1), SUBSTR(email, INSTR(email,'@')))j***@domain.com
Credit cardCONCAT(REPEAT('*', LENGTH(cc)-4), SUBSTR(cc,-4))************5678