I need to know that the plaintext
/ciphertext
being sent to Google CloudKMS, and the public/private key used to authenticate, are secure in transit, but I don't know how to prove that.
As per KMS docs, I created a service account, downloaded the JSON key file, and have hooked it up via the environment variable GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account-key.json
.
I am using the google-api-client gem (at version 0.10.3
, released 13 months old, because I can't install mime-types >= 3.0
whilst using padrino-mailer: see this commit), have tested the Google::Apis::CloudkmsV1::CloudKMSService
methods encrypt_crypto_key
and decrypt_crypto_key
, and they're working nicely.
I have tried reading through the source code of the google-api-client, googleauth, and signet gems. All I'm certain of is:
- The JSON key file is loaded and the
private_key
value is used to makeOpenSSL::PKey::RSA.new
here Signet::OAuth2::Client
is given the RSA key assigning_key
in this file
I would consider the security proven if the JSON key file is used to encrypt the string sent through encrypt_crypto_key
on the calling server, and likewise to decrypt the string received by decrypt_crypto_key
, and the CloudKMS server on the other end behaves similarly. This is what I'm assuming the library does – End-to-end encryption – but I must see it to believe it. I attempted to view the traffic in Wireshark but couldn't make any sense of it (maybe that fact proves it? I don't know )
Can anyone help me prove or disprove this method of calling CloudKMS to encrypt/decrypt user data – using the google-api-client gem with a JSON key file downloaded as per the docs – is secure?
Related: for those of you who are interested, the CloudKMS API is on the roadmap to be included in the newer google-cloud gem.