簡體   English   中英

使用來自 aws-sdk-v3 的 KMS 客戶端解密認知代碼

[英]Decrypting cognito codes with KMS client from aws-sdk-v3

我正在按照此說明在 Cognito https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-custom-sms-sender.html中實現自定義消息發件人

一切都適用於類似的代碼(我在 AWS Lambda 上使用 Typescript):

import {buildClient, CommitmentPolicy, KmsKeyringNode} from '@aws-crypto/client-node';
import b64 from 'base64-js';

const {decrypt} = buildClient(CommitmentPolicy.REQUIRE_ENCRYPT_ALLOW_DECRYPT);
const keyring = new KmsKeyringNode({keyIds: ["my-key-arn"]});

...
const {plaintext} = await decrypt(keyring, b64.toByteArray(event.request.code));
console.log(plainttext.toString()) // prints plain text exactly as I need

但是,這個庫@aws-crypto/client-node使我的包非常大,幾乎有 20MB。 可能是因為它依賴於一些舊的 AWS 庫......

我曾經使用像@aws-sdk/xxx這樣的模塊化庫,它確實提供了更小的包。

我發現對於加密/解密我可以使用@aws-sdk/client-kms 但它不起作用!

我正在嘗試以下代碼:

import {KMSClient, DecryptCommand} from "@aws-sdk/client-kms";
import b64 from 'base64-js';

const client = new KMSClient;
await client.send(new DecryptCommand({CiphertextBlob: b64.toByteArray(event.request.code), KeyId: 'my-key-arn'}))

這給了我一個錯誤:

InvalidCiphertextException: UnknownError
    at deserializeAws_json1_1InvalidCiphertextExceptionResponse (/projectdir/node_modules/@aws-sdk/client-kms/dist-cjs/protocols/Aws_json1_1.js:3157:23)
    at deserializeAws_json1_1DecryptCommandError (/projectdir/node_modules/@aws-sdk/client-kms/dist-cjs/protocols/Aws_json1_1.js:850:25)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async /projectdir/node_modules/@aws-sdk/middleware-serde/dist-cjs/deserializerMiddleware.js:7:24
    at async /projectdir/node_modules/@aws-sdk/middleware-signing/dist-cjs/middleware.js:14:20
    at async StandardRetryStrategy.retry (/projectdir/node_modules/@aws-sdk/middleware-retry/dist-cjs/StandardRetryStrategy.js:51:46)
    at async /projectdir/node_modules/@aws-sdk/middleware-logger/dist-cjs/loggerMiddleware.js:6:22
    at async REPL7:1:33 {
  '$fault': 'client',
  '$metadata': {
    httpStatusCode: 400,
    requestId: '<uuid>',
    extendedRequestId: undefined,
    cfId: undefined,
    attempts: 1,
    totalRetryDelay: 0
  },
  __type: 'InvalidCiphertextException'
}

我究竟做錯了什么? 這個 KMSClient 是否支持我需要的東西?

我也嘗試過 AWS CLI aws kms decrypt --ciphertext-blob...命令,給我完全相同的響應。 雖然如果我加密和解密任何隨機消息,如“hello world”,它就像一個魅力。

我做錯了什么,Cognito 代碼密文有什么特別之處,所以我必須以其他方式解密它?

簡短回答: Cognito 不使用 KMS 來加密文本,它使用加密 SDK。因此您不能使用 KMS 來解密 Cognito 密文。

更長的答案:我過去一天試圖使用 boto3 和 KMS 客戶端獲取 Python 電子郵件發件人觸發器 function 來對抗 Cognito,直到我找到另一篇文章(某處?)解釋 Cognito 不使用 KMS 加密數據,而是使用加密SDK。當然這兩種加密機制是不兼容的。

對於 JavaScript 和 Node.js 應用程序,看起來您可以選擇包含整個加密客戶端: https://www.npmjs.com/package/@aws-crypto/decrypt-node

如果你所做的只是解密,上面的 package 將讓你使用加密 SDK 解密,它只有 159KB。

我設法解決了我的任務。 我已經意識到它確實不是簡單地使用KMS來加密文本,加密/解密過程要復雜得多。

有參考頁https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/message-format.html

它描述了消息的外觀,包括所有標頭和正文、IV、AAD、密鑰等……我編寫了自己的腳本來解析所有內容並正確解密,它有效。 可能分享時間太長了……我建議改用參考資料。 希望將來他們會發布適當的 SDK 模塊化版本。

來自“@aws-crypto”的那個對我不起作用,可能沒有正確支持所有協議。 在您閱讀它的那一刻,這可能不是事實。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM