在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
您指出了以下例外情况:
NoSuchPaddingException, NoSuchAlgorithmException
InvalidAlgorithmParameterException, InvalidKeyException,
BadPaddingException, IllegalBlockSizeException
现在所有这些都是GeneralSecurityException
,因此很容易抓住它们。但是查看用例,您可能不想这样做。
如果您查看导致异常的原因,那么您会发现,仅在生成算法或键的实现时才会抛出这些异常中的任何一个(最后两个除外)。我认为在测试了应用程序之后,这些值或多或少保持静态是合理的。因此,抛出异常(例如)是合乎逻辑的IllegalStateException
。IllegalStateException
是运行时异常,不需要抛出(在方法签名中)或捕获。当然,您应将安全异常作为异常的
原因 。
现在最后两个例外,BadPaddingException
并且IllegalBlockSizeException
有所不同。它们取决于实际的密文,因此取决于算法的输入。现在,通常情况下,您应该始终在将输入输入Cipher
实例之前验证输入的完整性,例如通过首先验证HMAC校验和来初始化输入。因此从这种意义上讲,您仍然可以摆脱运行时异常。如果您不对完整性进行单独检查,则不应将其转换为RuntimeException
。相反,您可以让用户处理异常,也可以将其作为用例特定的异常重新抛出。
如果BadPaddingException
通过(重新)抛出来处理,则应该了解纯文本oracle攻击,例如padding
oracle攻击。对于CBC模式下的填充oracle攻击:如果攻击者可以尝试让您多次解密密文,并且收到解密成功(或失败)的提示,那么他们可以
检索消息的明文而不会破坏密文 。因此,在可以处理身份验证标签的其他16个字节的情况下,最好使用诸如GCM模式之类的身份验证模式。
最好使用单独的try
/
catch
块来构造和初始化Cipher
以及解密本身。你也可以捕捉到的异常BadPaddingException
和IllegalBlockSizeException
处理之前GeneralSecurityException
。从Java
7开始,您也可以使用多捕获语句(例如catch(final BadPaddingException | IllegalBlockSizeException e)
)。
最后一些注意事项:
BadPaddingException
并且IllegalBlockSizeException
可以通过被抛出Cipher
,因为由于数据没有被完全接收,或因为与数据攻击者搞乱;BadPaddingException
如果密钥不正确,也可能会抛出该错误。主要内容:异常简介,异常类型很多事件并非总是按照人们自己设计意愿顺利发展的,经常出现这样那样的异常情况。例如: 你计划周末郊游,计划从家里出发→到达目的→游泳→烧烤→回家。但天有不测风云,当你准备烧烤时候突然天降大雨,只能终止郊游提前回家。“天降大雨”是一种异常情况,你的计划应该考虑到这样的情况,并且应该有处理这种异常的预案。 计算机程序的编写也需要考虑处理这些异常情况。 异常(exception)是在运行程序时产生的一种异
我期望第1行捕获从第0行抛出的NullPointerException,但它没有发生。 但为什么呢?。 当定义了另一个catch块时,为什么第1行的NPE处理程序不能捕获它? 是因为“投掷”直接进入main()方法吗?
Java 的异常处理是 Java 语言的一大重要特性,也是提高代码健壮性的最强大方法之一。当我们编写了错误的代码时,编译器在编译期间可能会抛出异常,有时候即使编译正常,在运行代码的时候也可能会抛出异常。本小节我们将介绍什么是异常、Java 中异常类的架构、如何进行异常处理、如何自定义异常、什么是异常链、如何使用异常链等内容。 1. 什么是异常 异常就是程序上的错误,我们在编写程序的时候经常会产生错
问题内容: 我想从用户那里接收Double并处理抛出的异常,以防用户未输入double / int;在这种情况下,我想请用户再次输入金额。如果捕获到异常,我的代码将陷入循环,并继续打印“插入量”。 先感谢您。 问题答案: 你的程序进入时遇到一个无效的输入,因为一个无限循环,并 没有 消耗无效令牌。因此,导致该异常的任何标记都将保留在那里,并在下次您尝试读取double时继续引发异常。 这可以通过以
我使用的是java JDK1.8版本。当我将任何数字除以零(0)时,它会显示消息“infinity”。而它应该在运行时显示ArithmeticException:/zero。原因是什么。
本文向大家介绍浅谈java异常处理(父子异常的处理),包括了浅谈java异常处理(父子异常的处理)的使用技巧和注意事项,需要的朋友参考一下 我当初学java异常处理的时候,对于父子异常的处理,我记得几句话“子类方法只能抛出父类方法所抛出的异常或者是其子异常,子类构造器必须要抛出父类构造器的异常或者其父异常”。那个时候还不知道子类方法为什么要这样子抛出异常,后来通过学习《Thinking in Ja