簡體   English   中英

AWS Encryption SDK使用數據密鑰加密/解密

[英]AWS Encryption SDK Encrypt/Decrypt with Data Key

我正在嘗試使用KMS和AWS加密SDK加密數據。 查看AWS文檔中提供的示例,似乎無處可明確設置數據密鑰。

我找到了EncryptionMaterialsRequest類的API文檔,它允許您使用關聯的構建器類EncryptionMaterialsRequest.Builder設置明文密鑰,並且此類有一個返回EncryptionMaterials實例的方法。 在執行加密操作時,我找不到任何地方使用EncryptionMaterials實例。

這是我到目前為止的代碼。 請注意,請求中未使用EncryptionMaterials實例。

public static void encryptData(String dataToEncrypt, String keyID) {
    final KmsMasterKeyProvider prov = new KmsMasterKeyProvider(keyID);
    DefaultCryptoMaterialsManager manager = new DefaultCryptoMaterialsManager(prov);

    byte[] plaintextKey = generateDataKey(keyID);
    EncryptionMaterialsRequest request = EncryptionMaterialsRequest
        .newBuilder()
        .setPlaintext(plaintextKey)
        .build();

    EncryptionMaterials materials = manager.getMaterialsForEncrypt(request);
    AwsCrypto crypto = new AwsCrypto();
    String encryptedString = crypto.encryptString(manager, dataToEncrypt).getResult();
}

public byte[] generateDataKey(String keyID) {
    GenerateDataKeyRequest dataKeyRequest = new GenerateDataKeyRequest();
    dataKeyRequest.setKeyId(keyID);
    dataKeyRequest.setKeySpec(DataKeySpec.AES_256);
    GenerateDataKeyResult dataKeyResult = kmsClient.generateDataKey(dataKeyRequest);
    ByteBuffer encryptedKey = dataKeyResult.getCiphertextBlob();
    byte[] arr = new byte[encryptedKey.remaining()];
    encryptedKey.get(arr);
    return arr;
}

使用AWS Encryption SDK使用KMS生成的數據密鑰加密數據的建議方法是什么?

@Viccari是正確的,但聽起來圍繞這些結構的預期用途的某些上下文將有助於解釋原因。

除非您要構建自定義加密材料管理器,否則不應創建EncryptionMaterials ; 客戶和管理組件為您解決這個問題。

客戶端向加密材料管理器詢問每次加密調用的加密材料。 根據加密材料管理器的不同,接下來可能會發生什么不同。

DefaulCryptoMaterialsManager的情況下,它然后要求提供的主密鑰提供程序使用所有主密鑰,然后使用這些主密鑰生成和加密數據密鑰(一個用於生成和加密,任何其他用於加密)。

對於CachingCryptoMaterialsManager ,它在客戶端和另一個加密材料管理器之間添加了一個緩存層。

如果您想將AWS加密SDK與AWS KMS一起使用,建議的方法是在加密調用中簡單地提供KmsMasterKeyKmsMasterKeyProvider的實例,或最終使用其中一個的加密材料管理器。 所有細節均由客戶處理。

如果您對這些概念如何組合的更多細節感興趣,我們的概念文檔[1]將是一個很好的起點。

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

我的問題是:為什么不使用DefaultCryptoMaterialsManager ,它應該為每個加密操作從主密鑰生成一個新的數據密鑰? 你為什么要重用數據鍵? 從安全角度來看,這聽起來不像是一種合理的方法。

但是如果你想這樣做,你需要提供CryptoMaterialsManager接口的實現。

而不是使用DefaultCryptoMaterialsManager ,創建一個新類,比如MyCryptoMaterialsManager ,它實現了上面的接口。

像這樣的東西會這樣做:

public static void encryptData(String dataToEncrypt, String keyID) {
    // not sure whether you need this or where you're getting the data key from.
    final KmsMasterKeyProvider prov = new KmsMasterKeyProvider(keyID);
    MyCryptoMaterialsManager manager = new MyCryptoMaterialsManager(prov);

    byte[] plaintextKey = generateDataKey(keyID);
    EncryptionMaterialsRequest request = EncryptionMaterialsRequest
        .newBuilder()
        .setPlaintext(plaintextKey)
        .build();

    // this, you told you know how to do:
    EncryptionMaterials materials = manager.getMaterialsForEncrypt(request);
    AwsCrypto crypto = new AwsCrypto();
    String encryptedString = crypto.encryptString(manager, dataToEncrypt).getResult();
}

public byte[] generateDataKey(String keyID) {
    GenerateDataKeyRequest dataKeyRequest = new GenerateDataKeyRequest();
    dataKeyRequest.setKeyId(keyID);
    dataKeyRequest.setKeySpec(DataKeySpec.AES_256);
    GenerateDataKeyResult dataKeyResult = kmsClient.generateDataKey(dataKeyRequest);
    ByteBuffer encryptedKey = dataKeyResult.getCiphertextBlob();
    byte[] arr = new byte[encryptedKey.remaining()];
    encryptedKey.get(arr);
    return arr;
}

如果需要考慮KMS的成本或調用次數,您也可以使用CachingCryptoMaterialsManager 它提供了諸如確保數據密鑰不被無限次使用的保證。

暫無
暫無

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

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