1

我正在考虑创建几个密码并将它们放在一个集合中。主要是在创建密钥和初始化 Cipher 对象时进行优化。它们会被大量使用。

Map<Integer, Cipher> encrytors = new HashMap<Integer, Cipher>();

Key key = new SecretKeySpec(secret, KEY_ALGORITHM);
Cipher encrypter = Cipher.getInstance(CIPHER_ALOGORITHM);
encrypter.init(Cipher.ENCRYPT_MODE, key);
encrytors.put(1, encrypter);            

Key key2 = new SecretKeySpec(secret2, KEY_ALGORITHM);
Cipher encrypter2 = Cipher.getInstance(CIPHER_ALOGORITHM);
encrypter2.init(Cipher.ENCRYPT_MODE, key2);
encrytors.put(2, encrypter);

好坏?人们如何处理几个不同的密钥和密码?

4

2 回答 2

5

不要过早优化。

虽然创建 Cipher 实例并对其进行初始化一项相对昂贵的操作,但请先对其进行测试。只有在性能测试之后才能优化性能。

另请注意,Cipher 不是线程安全的(HashMap 也不是),以防您想在多个线程中使用此缓存。

于 2013-08-23T13:26:33.293 回答
1

就我个人而言,我不喜欢将Cipher实例放入Map. 大多数时候,我确实将地图和集合用于数据结构。密码实例不是数据结构,它们是执行特定操作的有状态类。

此外,我不喜欢通过不同的软件组件使用对象。将密码放入地图表明具有不同目标的各种不同类别使用。这意味着您正在创建此类和多个组件之间的紧密耦合。这不是一件好事。

也就是说,在类中重用类并没有什么问题Cipher。如果不应该重复例如 AES 的相对昂贵的密钥调度,这将特别有用。这取决于密码的实现如何处理。在这些情况下, 的实例Cipher只是private特定类(例如,aFileEncrypter或此类)的未公开字段,后续调用public方法可以访问该字段。

于 2013-08-24T00:51:06.243 回答