Điểm:1

Xoay khóa và lập phiên bản để mã hóa ở trạng thái nghỉ

lá cờ jp

Tôi đang làm việc với một nhóm nhà phát triển đang triển khai mã hóa ở trạng thái nghỉ ở cấp ứng dụng. Nó dành cho các trường đặc biệt nhạy cảm bên trong RDB. (Bộ lưu trữ DB cơ bản có một lớp mã hóa bổ sung, nhưng điều đó không có chủ đề ở đây.) Chúng tôi đang sử dụng Spring's AesBytesMã hóa và các lớp liên quan cho điều đó.

Chúng tôi vẫn chưa giải quyết hoàn toàn việc xoay phím và tôi đang điều tra cách thực hiện điều đó một cách an toàn. Chúng tôi muốn sử dụng một công cụ xoay phím riêng biệt sẽ chạy tách biệt với ứng dụng sử dụng dữ liệu. Công cụ xoay khóa đó sẽ truy cập DB một cách không đồng bộ và thực hiện mã hóa lại theo từng phần nhỏ. (Không phải trong một giao dịch DB duy nhất sẽ mã hóa lại tất cả dữ liệu.)

Để làm như vậy, chúng tôi dự định rằng ứng dụng có thể được định cấu hình bằng nhiều phím (tốt, hai) cùng một lúc. Nó sẽ luôn sử dụng khóa đầu tiên để mã hóa dữ liệu mới. Nhưng nó có thể giải mã dữ liệu cũ bằng một trong hai khóa, tùy thuộc vào việc công cụ xoay khóa đã mã hóa lại trường cụ thể hay chưa.

Bây giờ, câu hỏi đặt ra là liệu chúng ta có cần lưu trữ siêu dữ liệu phiên bản khóa bổ sung trong DB hay không? Điều đó sẽ cho ứng dụng biết khóa giải mã nào sẽ được sử dụng cho bất kỳ đoạn dữ liệu nào.

Thay vào đó, tôi hy vọng sẽ giải quyết được vấn đề đó bằng cách dựa vào một số tổng kiểm tra biểu mẫu. Ứng dụng sẽ lần lượt thử các khóa giải mã cho đến khi nhận được giá trị giải mã không phá vỡ tổng kiểm tra.

Imho, AesBytesEncryptor của Spring có thể đã cung cấp tất cả những gì chúng tôi cần. Nhưng độ tin cậy sẽ phụ thuộc vào chế độ chúng ta sử dụng. Đây là suy nghĩ của tôi về hai chế độ được hỗ trợ:

  • Chế độ AES/CBC/PKCS5Đệm: Không có tổng kiểm tra per-se, nhưng phần đệm có thể sẽ bị hỏng khi cố gắng giải mã bằng khóa sai. Tuy nhiên, điều này phụ thuộc vào kích thước của phần đệm, phụ thuộc vào kích thước dữ liệu văn bản gốc. Trường hợp xấu nhất có thể chỉ có 1byte đệm. Vì vậy, cơ hội để nhấn đúng phần đệm với khóa giải mã sai có thể lên tới 1/256. Điều đó dường như quá rủi ro để dựa vào.

  • Chế độ AES/GCM/NoPadding: Ở đây, "thẻ xác thực" GCM đóng vai trò là một dạng tổng kiểm tra. Theo như tôi hiểu thì AES luôn dài 128 bit (16 byte). Điều đó có nghĩa là cơ hội chạm vào thẻ xác thực hợp lệ với khóa giải mã sai là khoảng 1/(2^128).Điều đó thực tế là không bao giờ, vì vậy tôi nghĩ rằng nó sẽ phù hợp với ứng dụng của chúng tôi.

Các giả định trên có đúng không? Tôi đã làm gì sai?

Bạn có nghĩ rằng nó đủ mạnh để thử lần lượt nhiều khóa giải mã trong quá trình xoay khóa, khi sử dụng AES/GCM/NoPadding không? Hay rốt cuộc chúng ta có cần lưu trữ thông tin phiên bản chính cùng với dữ liệu được mã hóa không?

Hoặc, có cách nào tốt hơn để giải quyết xoay vòng khóa trong kịch bản của chúng tôi không?

SAI Peregrinus avatar
lá cờ si
Bạn có cần xoay khóa mã hóa dữ liệu thực tế (DEK) không? Cách phổ biến là có hai khóa: khóa mã hóa dữ liệu không bao giờ thay đổi và không bao giờ được lưu trữ. Điều đó được mã hóa bằng "khóa mã hóa khóa" (KEK) và giá trị được mã hóa đó (và KEK) được lưu trữ. Để xoay khóa, bạn giải mã DEK (vào RAM, như thường lệ) bằng KEK cũ, sau đó mã hóa nó bằng KEK mới và lưu trữ bản mã đó. Điều này có thể được thực hiện trong một giao dịch cơ sở dữ liệu duy nhất.
meeque avatar
lá cờ jp
Vâng, chúng tôi đang hướng tới cách tiếp cận KEK/DEK. Tuy nhiên, có nhiều hương vị khác nhau, ví dụ: khi nói đến [độ chi tiết](https://cloud.google.com/kms/docs/envelope-encryption#balancing_deks_and_keks). Hoặc, nếu và cách KEK/DEK cần được xoay. Tôi đã đi đến kết luận rằng chúng ta nên có khả năng xoay cả KEK và DEK. Và tôi nghĩ rằng câu hỏi này có liên quan đến một trong số họ. Đó là lý do tại sao tôi cố tránh chủ đề KEK/DEK. Điều đó nói rằng, nếu bất cứ ai muốn thay đổi suy nghĩ của tôi, tôi có thể hỏi một câu hỏi riêng cho điều đó ... Dù bằng cách nào, tôi vẫn muốn phản hồi về điều này :)
meeque avatar
lá cờ jp
Bất cứ ai khác muốn chụp một câu hỏi ban đầu?

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.