gpt4 book ai didi

java - 处理 Java 加密异常

转载 作者:搜寻专家 更新时间:2023-10-30 19:56:45 25 4
gpt4 key购买 nike

这段非常基本的代码在 Java 中处理加密/解密时非常常见。

final Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, key, iv);
cipher.doFinal(*something*);

仅这三行代码就可能引发六个异常,我不确定处理它们的最简洁(就代码可读性而言)的方法是什么。尝试使用六个 catch 子句对我来说真的很像。

在处理此类对象时,是否存在我显然遗漏的微模式或最佳实践?

编辑

对不起,我想我没有很好地解释自己。我的问题并不是真正要避免使用 try\catch 子句,而是是否有处理类似情况的通用方法。

密码异常是

NoSuchPaddingException, NoSuchAlgorithmException
InvalidAlgorithmParameterException, InvalidKeyException,
BadPaddingException, IllegalBlockSizeException

最佳答案

您指出了以下异常(exception)情况:

NoSuchPaddingException, NoSuchAlgorithmException
InvalidAlgorithmParameterException, InvalidKeyException,
BadPaddingException, IllegalBlockSizeException

现在所有这些都是GeneralSecurityException的,所以很容易捕获他们。但看看用例,您可能不想这样做。


如果您查看异常的原因,您会发现这些异常中的任何一个 - 除了最后两个 - 仅在生成算法或 key 的实现时才会抛出。我认为,一旦您测试了您的应用程序,这些值或多或少保持不变是合理的。因此,抛出 - 例如 - IllegalStateException 是合乎逻辑的。 . IllegalStateException 是一个运行时异常,您不需要抛出(在方法签名中)或捕获。当然,您应该将安全异常作为异常的原因


现在最后两个异常(exception),BadPaddingExceptionIllegalBlockSizeException是不同的。它们取决于实际的密文,因此它们取决于算法的输入。现在通常在将输入输入 Cipher 之前,您应该始终验证输入的完整性。例如,启动解密,例如首先验证 HMAC 校验和)。所以从这个意义上说,你仍然可以摆脱运行时异常。如果您不执行单独的完整性检查,那么您应该执行的操作不应转换为 RuntimeException。相反,您可以让用户处理异常,或者将其作为特定于用例的异常重新抛出。

如果您通过(重新)抛出 BadPaddingException 来处理它,那么应该了解明文 oracle 攻击,例如填充 oracle 攻击。对于 CBC 模式中的填充 oracle 攻击:如果对手可以尝试让您多次解密密文并收到解密失败(或未失败)的指示,那么他们可以检索消息的明文而不破坏密码。出于这个原因,在可以处理身份验证标记的 16 个额外字节的情况下,应该首选 GCM 模式等身份验证模式。


最好使用单独的 try/catch block 来构建和初始化 Cipher 以及解密本身。您还可以在处理 GeneralSecurityException 之前捕获异常 BadPaddingExceptionIllegalBlockSizeException .从 Java 7 开始,您也可以使用 multi-catch 语句(例如 catch(final BadPaddingException | IllegalBlockSizeException e))。


最后是一些注意事项:

  • BadPaddingExceptionIllegalBlockSizeException可能是Cipher因为数据没有完全接收到而抛出,也可能是因为攻击者篡改了数据;
  • BadPaddingException如果 key 不正确,也可能会抛出。
  • 请注意,如果未安装无限制的加密文件,AES key 大小 192 位和 256 位可能会引发异常(查看 Oracle JavaSE site 了解更多信息);您应该在应用程序启动时检查 key 大小是否允许(这主要适用于旧的/已弃用的 Java 版本)。较新版本的 Java 不需要这些无限制的加密文件。

关于java - 处理 Java 加密异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15709421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com