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
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
}
}
TA貢獻1802條經驗 獲得超10個贊
“AWS Encryption SDK 的所有特定語言的實施,包括 AWS Encryption CLI,都是可互操作的?!?nbsp;引用自aws 文檔。因此,您的問題正文中缺少的鏈接必須包含虛假信息。
文檔中有基本示例。使用您的密鑰 ID初始化 KmsMasterKeyProvider應該會為您完成。
您為什么不將加密部分包裝在使用 AWS 加密 SDK 的 java 程序中,這樣您就不必擔心“互操作性”?
添加回答
舉報
