Snowflake java UDF AES_256/GCM/NoPadding 不可用

Snowflake java UDF AES_256/GCM/NoPadding not available

提问人:LeoG 提问时间:11/15/2023 更新时间:11/15/2023 访问量:31

问:

我有用Groovy编写的外部加密函数,并尝试使用Java在Snowflake中编写解密UDF。我收到错误。java.security.NoSuchAlgorithmException:在 java 上找不到任何支持“AES_256/GCM/NoPadding”的提供程序。Base/javax.crypto.Cipher.getInstance(Cipher.java:565) 在 function_handler_0//utility.decrypt(InlineCode.java:32)

下面是 java 函数:

private static final int KEY_LENGTH = 256;
private static final int ITERATION_COUNT = 10000; //65536;
private static final byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
// private static GCMParameterSpec parameterSpec = new GCMParameterSpec(128, iv);

public static String decrypt(String strToDecrypt, String secretKey, String salt) {

    try {

        GCMParameterSpec parameterSpec = new GCMParameterSpec(128, iv);
        byte[] encryptedData = Base64.getMimeDecoder().decode(strToDecrypt);

        SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
        KeySpec spec = new PBEKeySpec(secretKey.toCharArray(), salt.getBytes(), 65536, 256);
        SecretKey tmp = factory.generateSecret(spec);
        SecretKeySpec secretKeySpec = new SecretKeySpec(tmp.getEncoded(), "AES");
   
        //cipher creation and decryption
        Cipher cipher = Cipher.getInstance("AES_256/GCM/NoPadding");
        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, parameterSpec);
        byte[] decryptedText = cipher.doFinal(encryptedData);
        return new String(decryptedText, "UTF-8");

    } catch (Exception e) {
        // Handle the exception properly
        e.printStackTrace();
        return null;
    }
}

解密功能在 Snowflake 之外工作正常。

有什么建议吗?

java 加密 snowflake-cloud-data-platform

评论

0赞 Andrew Henle 11/15/2023
AES/GCM 的 Java 名称是 AES/GCM/NoPadding
0赞 matt 11/15/2023
这是 java 无限强度加密的问题吗?docs.oracle.com/cd/E60058_01/PDF/8.0.6.x/8.0.6.0.0/AG_HTML/......Snowflake 运行的是哪个版本的 Java?
0赞 LeoG 11/16/2023
@matt JDK() 11.0.14.1
0赞 LeoG 11/16/2023
@AndrewHenle但它在雪花之外工作得很好。
0赞 Andrew Henle 11/16/2023
@LeoG 仅仅因为某些 Java 实现接受 Java 标准之外的加密算法并不意味着每个实现都会接受。没关系,“256”无论如何都是多余的,因为算法位数是由密钥的大小指定的。它实际上比冗余更糟糕 - 现在你需要更多的代码来处理 AES-128 和 AES-256。如果您只使用 Java 标准,则只有一个版本的代码可以处理所有密钥大小......AES_256AES/GCM/NoPadding

答: 暂无答案