Hỗ trợ UUIDv7 của PostgreSQL 18 gây tranh cãi về bảo mật và quyền riêng tư trong cộng đồng lập trình viên

Nhóm Cộng đồng BigGo
Hỗ trợ UUIDv7 của PostgreSQL 18 gây tranh cãi về bảo mật và quyền riêng tư trong cộng đồng lập trình viên

PostgreSQL 18 giới thiệu hỗ trợ tích hợp cho UUIDv7 , một biến thể UUID dựa trên timestamp được thiết kế để giải quyết các vấn đề hiệu suất lâu đời với chỉ mục cơ sở dữ liệu. Mặc dù bổ sung này hứa hẹn hiệu suất tốt hơn cho các khối lượng công việc ghi nặng, nó đã gây ra cuộc tranh luận gay gắt trong cộng đồng lập trình viên về những tác động bảo mật và quyền riêng tư khi tiết lộ thông tin timestamp trong các định danh.

Cấu trúc phân tích UUIDv7:

  • 48 bit: Dấu thời gian Unix (độ chính xác mili giây)
  • 12 bit: Độ chính xác dưới mili giây hoặc dữ liệu ngẫu nhiên
  • 62 bit: Giá trị ngẫu nhiên
  • Tổng entropy: ~74 bit (không bao gồm dấu thời gian)
PostgreSQL 18 giới thiệu UUIDv7, nâng cao hiệu suất nhưng gây ra các cuộc thảo luận về bảo mật
PostgreSQL 18 giới thiệu UUIDv7, nâng cao hiệu suất nhưng gây ra các cuộc thảo luận về bảo mật

Mối quan ngại bảo mật cốt lõi: Rò rỉ thông tin

Tranh cãi chính tập trung xung quanh timestamp được nhúng trong UUIDv7 , thứ tiết lộ thời điểm một bản ghi cơ sở dữ liệu được tạo. Không giống như UUIDv4 truyền thống chứa dữ liệu hoàn toàn ngẫu nhiên, UUIDv7 sử dụng 48 bit cho Unix timestamp và 74 bit cho các giá trị ngẫu nhiên. Lựa chọn thiết kế này đã chia rẽ các lập trình viên về việc liệu lợi ích hiệu suất có vượt trội hơn các rủi ro quyền riêng tư tiềm ẩn hay không.

Một số lập trình viên đã nêu lên mối quan ngại về việc tiết lộ thông tin thông qua những timestamp này. Dữ liệu thời gian có thể tiết lộ thông tin kinh doanh như mô hình tăng trưởng người dùng, đỉnh hoạt động, hoặc lịch trình vận hành. Trong môi trường cạnh tranh, siêu dữ liệu này có thể cung cấp cái nhìn sâu sắc về hiệu suất công ty mà các tổ chức muốn giữ bí mật.

So sánh bảo mật theo phiên bản UUID:

  • UUIDv4: 122 bit ngẫu nhiên, không rò rỉ thông tin
  • UUIDv7: 74 bit ngẫu nhiên, tiết lộ thời gian tạo
  • UUIDv1: Chứa địa chỉ MAC và thời gian (phiên bản cũ)
  • Độ phức tạp tấn công: 4.7 × 10²² tổ hợp có thể có cho phần ngẫu nhiên của UUIDv7

Bài toán German Tank được nhắc lại

Các cuộc thảo luận trong cộng đồng đã rút ra những điểm tương đồng với bài toán German Tank nổi tiếng từ Thế chiến thứ hai, nơi lực lượng Đồng minh ước tính sản xuất xe tăng của Đức bằng cách phân tích số sê-ri. Tương tự, timestamp của UUIDv7 có thể rò rỉ thông tin về mô hình hoạt động hệ thống và tỷ lệ tăng trưởng.

Bạn đã làm hệ thống của mình trở nên mong manh. Cho đến tận cùng thời gian, mọi người viết bất kỳ đoạn code nào di chuyển dữ liệu từ bảng này đến nơi khác đều phải nhớ rằng khóa chính tiết lộ thời gian tạo.

Mối quan ngại mở rộng ra ngoài các lỗ hổng bảo mật trực tiếp đến những cân nhắc quyền riêng tư rộng hơn. Khi UUID được tiết lộ trong URL hoặc API , thông tin timestamp trở nên có thể truy cập được với bất kỳ ai có thể quan sát những định danh này.

Các kịch bản tấn công thực tế

Mặc dù còn lại 62 bit tính ngẫu nhiên sau timestamp , các lập trình viên lo lắng về các cuộc tấn công tương quan. Nếu kẻ tấn công biết gần đúng thời điểm người dùng tạo tài khoản và có thể thu hẹp các UUID tiềm năng dựa trên thời gian, entropy còn lại có thể không cung cấp đủ bảo vệ trong tất cả các kịch bản.

Tuy nhiên, nhiều lập trình viên cho rằng những mối quan ngại này bị thổi phồng đối với hầu hết các ứng dụng. Thực tế toán học là rõ ràng: ngay cả với kiến thức timestamp hoàn hảo, kẻ tấn công sẽ cần hàng tỷ lần đoán mỗi giây trong nhiều thập kỷ để brute-force một UUID duy nhất.

Các biến thể triển khai tăng thêm độ phức tạp

Bức tranh bảo mật trở nên mờ mịt hơn khi xem xét các triển khai UUIDv7 khác nhau. Trong khi PostgreSQL 18 cung cấp đảm bảo mạnh mẽ với độ chính xác sub-millisecond 12-bit , các triển khai khác khác nhau đáng kể. Ví dụ, triển khai của Python 3.14 chỉ sử dụng 32 bit ngẫu nhiên, giảm đáng kể không gian tìm kiếm cho các kẻ tấn công tiềm năng.

Sự không nhất quán này trên các nền tảng có nghĩa là các lập trình viên không thể giả định các thuộc tính bảo mật đồng nhất khi làm việc với UUIDv7 trên các hệ thống và thư viện khác nhau.

Tính năng chính của PostgreSQL 18:

  • Hàm uuidv7() gốc với đảm bảo tính đơn điệu
  • Bí danh uuidv4() cho gen_random_uuid()
  • Cập nhật các hàm trích xuất timestamp cho UUIDv7
  • Phân số timestamp sub-millisecond 12-bit để sắp xếp
  • Hỗ trợ Async I/O (cải thiện hiệu suất 2-3 lần)
  • Phiên bản giao thức wire mới 3.2

Các phương pháp thay thế và khuyến nghị

Cộng đồng đã đề xuất một số giải pháp cho các tổ chức quan ngại về rò rỉ timestamp . Bao gồm sử dụng mã hóa hoặc hàm HMAC để che giấu các định danh hướng ra công chúng, triển khai UUID ngẫu nhiên riêng biệt cho API bên ngoài trong khi giữ UUIDv7 cho các hoạt động nội bộ, hoặc áp dụng các phương pháp lai chuyển đổi UUIDv7 thành UUIDv4 tại ranh giới API .

Đối với nhiều ứng dụng, sự đồng thuận cho rằng UUIDv7 hoạt động tốt cho các hoạt động cơ sở dữ liệu nội bộ nơi hiệu suất quan trọng, trong khi các định danh ngẫu nhiên riêng biệt xử lý các nhu cầu hướng ra công chúng nơi quyền riêng tư là tối quan trọng.

Cuộc tranh luận làm nổi bật một căng thẳng cơ bản trong thiết kế cơ sở dữ liệu hiện đại: cân bằng tối ưu hóa hiệu suất với bảo vệ quyền riêng tư. Khi PostgreSQL 18 tiến gần đến bản phát hành tháng Chín, các lập trình viên sẽ cần đánh giá cẩn thận liệu lợi ích của UUIDv7 có phù hợp với các yêu cầu bảo mật và quyền riêng tư cụ thể của họ hay không.

Tham khảo: UUIDv7 Comes to PostgreSQL 18