Узел: AWS KMS стирает открытый ключ из памяти - PullRequest
0 голосов
/ 01 октября 2019

Из документов для операции KMS GenerateDataKey https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html

We recommend that you use the following pattern to encrypt data locally in your application:

Use the GenerateDataKey operation to get a data encryption key.

Use the plaintext data key (returned in the Plaintext field of the response) to encrypt data locally, then erase the plaintext data key from memory.

Достаточно ли этого кода, чтобы гарантировать, что ключ открытого текста был удален из памяти при его использовании.

const aws = require("aws-sdk");
const kms = new aws.KMS({...config});

(async () => {

    /** {Plaintext: Buffer, CiphertextBlob: Buffer} **/
    let dataKey = await kms.generateDataKey({...options}).promise();

    let encryptedString = MyEncryptionFunction(dataKey.Plaintext, "Hello World");

    dataKey.Plaintext.fill(0); //overwrite the buffer with zeroes to erase from memory;
})();

function MyEncryptionFunction(key, dataString) {
    let iv = crypto.randomBytes(16);
    let cipher = crypto.createCipheriv("aes256", key, iv);
    return cipher.update(dataString, "utf8", "hex") + cipher.final("hex");
}

Можно ли предположить, что aws sdk не пропускает / не копирует ключ в другие части памяти, и то же самое с функцией createCipheriv встроенной криптографической библиотеки и просто перезаписывает Plaintextбуфер с нулями должен достаточно стереть ключ из памяти?

1 Ответ

2 голосов
/ 02 октября 2019

Это то, что делает AWS Encryption SDK для JavaScript [1]. Фактически, если Encryption SDK предоставляет необходимые вам функции, я бы порекомендовал просто использовать это.

aws-sdk рассматривает это значение как чувствительное и создает изолированный буфер в Node.js [2]. Это означает, что ключ открытого текста находится в области действия этой функции и пока он не разделяет ее, других копий нет, и никто не имеет доступа. (Применяется обычное «нет плохих людей, имеющих root-доступ к вашему серверу»)

Отслеживание вызова createCipheriv в узле [3] .. [4]он передает ссылку на ключ openSSL, а не копию.

[1] https://github.com/aws/aws-encryption-sdk-javascript/blob/master/modules/material-management/src/cryptographic_material.ts#L343

[2] https://github.com/aws/aws-sdk-js/pull/2622/files

[3] https://github.com/nodejs/node/blob/master/lib/crypto.js#L114

[4] https://github.com/nodejs/node/blob/master/src/node_crypto.cc#L4099

...