3 回答

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超5個(gè)贊
這里的混淆歸結(jié)為直接通過 AWS 開發(fā)工具包使用 AWS KMS 和使用 AWS 加密開發(fā)工具包之間的區(qū)別。
AWS 加密 SDK 使用 KMS(或其他密鑰提供程序)作為信封加密格式的一部分 [1]。因此,您引用的代碼段是正確的:AWS Encryption SDK 的輸出不能被 KMS 直接解密,反之亦然。
但是,所有 AWS 加密 SDK 實(shí)施都相互兼容。
如果您想從 CLI 加密一些可以傳遞給 Java/JVM 代碼進(jìn)行解密的內(nèi)容,那么使用 AWS Encryption SDK CLI 和適用于 Java 的 AWS Encryption SDK 絕對可以實(shí)現(xiàn)。
資料來源:我編寫了適用于 Python[2] 和 CLI[3] 的 AWS 加密 SDK,并就適用于 C[4] 的 AWS 加密 SDK 以及我們的文檔 [5] 提供了建議。
至于為什么您無法使用AWSKmsClientAWS CLI 直接調(diào)用 KMS 來解密您收到的值,根據(jù)您收到的錯(cuò)誤有多種可能性。
一種可能性是您可能沒有DecryptCMK 的權(quán)限。這應(yīng)該會導(dǎo)致來自 KMS 的權(quán)限錯(cuò)誤。
另一種可能性是您提供的密文無效。AWS CLI 在返回之前自動對從 KMS 接收的二進(jìn)制數(shù)據(jù)進(jìn)行 base64 編碼CiphertextBlob,因?yàn)榇蠖鄶?shù) shell 不能很好地處理二進(jìn)制數(shù)據(jù)。但是,AWSKmsClient在將任何內(nèi)容發(fā)送到 KMS 之前,它不會自動對其進(jìn)行 base64 解碼。您必須提供原始字節(jié)。因此,如果您AWSKmsClient在解密請求中提供 base64 編碼的字符串,那么 KMS 將拋出您提供了無效密文的錯(cuò)誤。
[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貢獻(xiàn)1817條經(jīng)驗(yàn) 獲得超6個(gè)贊
我已經(jīng)設(shè)法使用 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貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超10個(gè)贊
“AWS Encryption SDK 的所有特定語言的實(shí)施,包括 AWS Encryption CLI,都是可互操作的?!?nbsp;引用自aws 文檔。因此,您的問題正文中缺少的鏈接必須包含虛假信息。
文檔中有基本示例。使用您的密鑰 ID初始化 KmsMasterKeyProvider應(yīng)該會為您完成。
您為什么不將加密部分包裝在使用 AWS 加密 SDK 的 java 程序中,這樣您就不必?fù)?dān)心“互操作性”?
添加回答
舉報(bào)