亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用帶有 Java 或 AWSKmsClient 的 AWS 加密 SDK 解密

如何使用帶有 Java 或 AWSKmsClient 的 AWS 加密 SDK 解密

慕容3067478 2022-10-20 15:04:52
我想使用 AWSKmsClient 或 AWS Encryption SDK 和 Java 來解密我使用加密的消息AWS CLI我使用以下方法創建了一條加密消息:aws kms encrypt --key-id 123421-4032-412c-4321-eds42d1a1b432 --plaintext MyText --output text --query CiphertextBlob它為我生成了類似這樣的內容: ADCCAHhJotXoy8910T/Pd8PXVaF/Xkg+9NrF9QTy/XlW7rTtUAH6zACj9MbEY1cS7526GfscAAAAZjBkBgkqhkiG9w0BBwagVzBVAgEAMFAGCSqGSIb3DQEHATAeBglghkgBZDEEAS4wEQQMGmYHb67SV66h/eE0AgEQgCONMNda4kVsSi9sPAXXts2F0N/mwjSlIB2ngJcAyxymnltrHQ==我想將此傳遞給我的 scala-spark 代碼并使用 AWSKmsClient 或使用 Java 的 AWS 加密 SDK 對其進行解密?;诖随溄?,AWS Encryption SDK 和 AWS KMS 之間似乎存在一些差異:適用于 Java 的 AWS 加密開發工具包并不意味著與 aws kms 命令行工具兼容。簡而言之,AWS 加密 SDK 利用 KMS 提供比單獨使用 KMS 更通用的加密功能我也無法用 AWSKmsClient 做到這一點,我錯過了什么嗎?有沒有更好的方法來實現這一目標?
查看完整描述

3 回答

?
滄海一幻覺

TA貢獻1824條經驗 獲得超5個贊

這里的混淆歸結為直接通過 AWS 開發工具包使用 AWS KMS 和使用 AWS 加密開發工具包之間的區別。


AWS 加密 SDK 使用 KMS(或其他密鑰提供程序)作為信封加密格式的一部分 [1]。因此,您引用的代碼段是正確的:AWS Encryption SDK 的輸出不能被 KMS 直接解密,反之亦然。


但是,所有 AWS 加密 SDK 實施都相互兼容。


如果您想從 CLI 加密一些可以傳遞給 Java/JVM 代碼進行解密的內容,那么使用 AWS Encryption SDK CLI 和適用于 Java 的 AWS Encryption SDK 絕對可以實現。


資料來源:我編寫了適用于 Python[2] 和 CLI[3] 的 AWS 加密 SDK,并就適用于 C[4] 的 AWS 加密 SDK 以及我們的文檔 [5] 提供了建議。


至于為什么您無法使用AWSKmsClientAWS CLI 直接調用 KMS 來解密您收到的值,根據您收到的錯誤有多種可能性。


一種可能性是您可能沒有DecryptCMK 的權限。這應該會導致來自 KMS 的權限錯誤。


另一種可能性是您提供的密文無效。AWS CLI 在返回之前自動對從 KMS 接收的二進制數據進行 base64 編碼CiphertextBlob,因為大多數 shell 不能很好地處理二進制數據。但是,AWSKmsClient在將任何內容發送到 KMS 之前,它不會自動對其進行 base64 解碼。您必須提供原始字節。因此,如果您AWSKmsClient在解密請求中提供 base64 編碼的字符串,那么 KMS 將拋出您提供了無效密文的錯誤。


[1] https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/message-format.html


[2] https://aws-encryption-sdk-python.readthedocs.io/en/latest/


[3] https://aws-encryption-sdk-cli.readthedocs.io/en/latest/


[4] https://github.com/awslabs/aws-encryption-sdk-c


[5] https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/introduction.html


查看完整回答
反對 回復 2022-10-20
?
慕的地6264312

TA貢獻1817條經驗 獲得超6個贊

我已經設法使用 AWSKMSClient


import java.nio.charset.StandardCharsets


import com.amazonaws.services.kms.{AWSKMS, AWSKMSClientBuilder}

import com.amazonaws.services.kms.model.DecryptRequest

import java.nio.ByteBuffer

import com.google.common.io.BaseEncoding


object KMSUtils {


  val keyId = "arn:aws:kms:us-east-1:{Account ID}:key/{KEY ID}"


  def decrypt(base64EncodedValue: String): String = {

    val kmsClient: AWSKMS = AWSKMSClientBuilder.standard.build


    val textDecoded: ByteBuffer = ByteBuffer.wrap(BaseEncoding.base64().decode(base64EncodedValue))


    val req : DecryptRequest = new DecryptRequest().withCiphertextBlob(textDecoded)

    val plainText : ByteBuffer = kmsClient.decrypt(req).getPlaintext


    val printable = StandardCharsets.UTF_8.decode(plainText).toString


    return printable

  }


}


查看完整回答
反對 回復 2022-10-20
?
守候你守候我

TA貢獻1802條經驗 獲得超10個贊

“AWS Encryption SDK 的所有特定語言的實施,包括 AWS Encryption CLI,都是可互操作的?!?nbsp;引用自aws 文檔。因此,您的問題正文中缺少的鏈接必須包含虛假信息。

文檔中有基本示例。使用您的密鑰 ID初始化 KmsMasterKeyProvider應該會為您完成。

您為什么不將加密部分包裝在使用 AWS 加密 SDK 的 java 程序中,這樣您就不必擔心“互操作性”?



查看完整回答
反對 回復 2022-10-20
  • 3 回答
  • 0 關注
  • 437 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號