[英]AWS Cognito - verify token using JWT vs cognito.getUser SDK
[英]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.