Re: [Proposal] Table-level Transparent Data Encryption (TDE) and Key Management Service (KMS)
Bruce Momjian <bruce@momjian.us>
From: Bruce Momjian <bruce@momjian.us>
To: Masahiko Sawada <sawada.mshk@gmail.com>
Cc: Joe Conway <mail@joeconway.com>, Antonin Houska <ah@cybertec.at>, Stephen Frost <sfrost@snowman.net>, Tomas Vondra <tomas.vondra@2ndquadrant.com>, Robert Haas <robertmhaas@gmail.com>, Haribabu Kommi <kommi.haribabu@gmail.com>, "Moon, Insung" <Moon_Insung_i3@lab.ntt.co.jp>, Ibrar Ahmed <ibrar.ahmad@gmail.com>, PostgreSQL-development <pgsql-hackers@postgresql.org>
Date: 2019-08-06T17:55:38Z
Lists: pgsql-hackers
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Revamp the WAL record format.
- 2c03216d8311 9.5.0 cited
On Wed, Aug 7, 2019 at 12:31:58AM +0900, Masahiko Sawada wrote: > Well, so you mean that for example we encrypt only 100 bytes WAL > record when append 100 bytes WAL records? > > For WAL encryption, if we encrypt the entire 8k WAL page and write the > entire page, the encrypted-and-written page will contain 100 bytes WAL > record data and (8192-100) bytes garbage (omitted WAL page header for > simplify), although WAL data on WAL buffer is still not encrypted > state. And then if we append 200 bytes again, the > encrypted-and-written page will contain 300 bytes WAL record data and > (8192-300)bytes garbage, data on WAL buffer is still not encrypted > state though. > > In this case I think the first 100 bytes of two 8k WAL pages are the > same because we encrypted both from the beginning of the page with the > counter = 0. But the next 200 bytes are different; it's (encrypted) > garbage in the former case but it's (encrypted) WAL record data in the > latter case. I think that's a problem. > > On the other hand, if we encrypt 8k WAL page with the different > counter of nonce after append 200 byes WAL record, the first 100 byte > (and of course the entire 8k page also) will be different. However > since it's the same thing doing as changing already-flushed WAL record > on the disk it's bad. > > Also, if we encrypt only append data instead of entire 8k page, we > would need to have the information in somewhere about how much byte > the WAL page has valid values. Otherwise reading WAL would not work > fine. OK, onlist reply. We are going to encrypt the _entire_ WAL stream as we write it, which is possible with CTR. If we write 200 bytes of WAL, we encrypt/XOR 200 bytes of WAL. If we write 10k of WAL, and 8k of that is an 8k page, we encrypt the entire 10k of WAL --- we don't care if there is an 8k page in there or not. CTR mode creates a bit stream for the first 16 bytes with nonce of (segment_number, counter = 0), and the next 16 bytes with (segment_number, counter = 1), etc. We only XOR using the parts of the bit stream we want to use. We don't care what the WAL content is --- we just XOR it with the stream with the matching counter for that part of the WAL. It is true we are encrypting the same 8k page in the heap/index page, and in WAL, with different key/nonce combinations, which I think is secure. What is insecure is to encrypt two different pieces of data with the same key/nonce combination. -- Bruce Momjian <bruce@momjian.us> http://momjian.us EnterpriseDB http://enterprisedb.com + As you are, so once was I. As I am, so you will be. + + Ancient Roman grave inscription +