Узел: AWS KMS стирает открытый ключ из памяти

Из документации по операции 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 нулями должна достаточно стереть ключ из Память?


person Greg Hornby    schedule 01.10.2019    source источник


Ответы (1)


Это то, что делает 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

person ryan    schedule 01.10.2019
comment
Ваше здоровье. Я не уверен, как именно я могу получить доступ к этому методу zeroUnencryptedDataKey, чтобы вызвать его, но я предполагаю, что если я сам просто заполню буфер нулями, он в основном сделает то же самое и исчезнет из памяти. - person Greg Hornby; 02.10.2019
comment
Вам не нужно вызывать функцию самостоятельно. Encryption SDK будет вызывать его всякий раз, когда это будет сделано с материалом. - person ryan; 04.10.2019