如何在Cassandra中读取加密的CDC

时间:2018-03-27 05:09:35

标签: encryption cassandra datastax-enterprise tde

我们已经为Cassandra DSE中的所有表实现了TDE。我们使用AES / ECB / PKCS5Padding / 128作为密码算法生成系统密钥。

我们还为几个需要cdc捕获的表启用了cdc。由于为表启用了TDE,因此cdc日志也会被加密。

我们需要将cdc捕获推送到kafka主题。我们尝试使用system_key文件中生成的system_key自动解密文件。

AES / ECB / PKCS5Padding:128:(key)的

但是我们得到java.security.InvalidKeyException:非法密钥大小或默认参数

请告知是否密钥可用于解密cdc日志或建议任何解决方案。

以下是我们用于解密的代码段。

public class EncryptDecrypt {

public static String encrypt(String input, String key) {
    byte[] crypted = null;
    try {

        SecretKeySpec skey = new SecretKeySpec(key.getBytes(), "AES");

        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, skey);
        crypted = cipher.doFinal(input.getBytes());
    } catch (Exception e) {
        System.out.println(e.toString());
    }
    java.util.Base64.Encoder encoder = java.util.Base64.getEncoder();

    return new String(encoder.encodeToString(crypted));
}

public static String decrypt(String input, String key) {
    byte[] output = null;
    try {
        java.util.Base64.Decoder decoder = java.util.Base64.getDecoder();
        SecretKeySpec skey = new SecretKeySpec(key.getBytes(), "AES");          
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, skey);
        output = cipher.doFinal(decoder.decode(input));
    } catch (Exception e) {
        System.out.println(e.toString());
    }
    return new String(output);
}

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub

    String key = "qhk9gDtvTUlLW9dnh/UMaw==";
    String data = "ABC";

    System.out.println(EncryptDecrypt.encrypt(data, key));
    System.out.println(EncryptDecrypt.decrypt(EncryptDecrypt.encrypt(data, key), key));
}
}

1 个答案:

答案 0 :(得分:0)

system_key文件不用于直接加密数据,而是用于加密存储在dse_system.encrypted_keys中的实际加密密钥。为算法/强度的每个组合生成这些键。有关详细信息,请参阅documentation