Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 密码对象是可重用的吗?_Java_Performance_Encryption - Fatal编程技术网

Java 密码对象是可重用的吗?

Java 密码对象是可重用的吗?,java,performance,encryption,Java,Performance,Encryption,由于getInstance和init的方法参数不变,我可以在多个方法中使用相同的Cipher对象吗 例如,假设应用程序的多个部分在实用程序类中使用decrypt方法。传递的所有加密值都是使用相同的密钥和算法生成的。那么,我可以重用相同的密码对象吗 是否真的值得担心多次创建密码(这可能导致创建密钥规范,SecretKey对象) 您可以重复使用cipher对象,但每次都必须通过为每个操作调用init()来初始化它 如果您担心重新创建KeySpec,则应该保存它并在multiple init()中使用

由于
getInstance
init
的方法参数不变,我可以在多个方法中使用相同的
Cipher
对象吗

例如,假设应用程序的多个部分在实用程序类中使用
decrypt
方法。传递的所有加密值都是使用相同的密钥和算法生成的。那么,我可以重用相同的
密码
对象吗


是否真的值得担心多次创建
密码
(这可能导致创建
密钥规范
SecretKey
对象)

您可以重复使用cipher对象,但每次都必须通过为每个操作调用init()来初始化它

如果您担心重新创建KeySpec,则应该保存它并在multiple init()中使用相同的值。

如文件所述:

完成后,此方法将此密码对象重置为它所处的状态 以前通过调用init初始化时处于。就是 对象被重置并可用于加密或解密(取决于 调用init时指定的操作模式)更多数据


是的,但是。。。为什么?也就是说,使用任何算法的“新密码”实现几乎没有开销。“init()”调用的开销更大,必须按如下方式重新执行:

  SecretKey secretKey = new SecretKeySpec(key,baseAlgorithm);
  Cipher cipher = Cipher.getInstance(algorithm);
  IvParameterSpec ivSpec = new IvParameterSpec(iv);
  cipher.init(Cipher.ENCRYPT_MODE,secretKey,ivSpec);
其中:

  • 键是一个字节数组
  • baseAlgorithm是一个类似于“AES”的名称,适用于密钥类型
  • 算法的名称类似于“AES…”
  • iv是初始化向量(字节数组)

谢谢您的回复。只是确认一下,您的意思是每个doFinal()必须调用一个init()?正如Javadocs for doFinal()明确指出的那样,“完成后,此方法将此密码对象重置为之前通过调用init初始化时的状态。也就是说,该对象被重置并可用于加密或解密(取决于调用init时指定的操作模式)更多数据。“GregS是正确的。这个答案是错误的。不幸的是,stackoverflow向导不允许我撤消错误的upvote,因为它现在已“锁定”。错误的设计选择向导。来自Javadocs for init():请注意,当一个密码对象被初始化时,它会丢失以前获得的所有状态。换句话说,初始化密码等同于创建一个新的密码实例并初始化它