我正在考虑创建几个密码并将它们放在一个集合中。主要用于在创建密钥和初始化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);
好/坏?人们如何处理几种不同的密钥和密码?
答案 0 :(得分:5)
不要过早优化。
创建Cipher实例并初始化它是相对昂贵的操作时,请先测试它。只有在性能测试之后才能优化性能。
另请注意,如果您想在多个线程中使用此缓存,则Cipher不是线程安全的(也不是HashMap)。
答案 1 :(得分:1)
我个人不喜欢将Cipher
个实例放在Map
中。大部分时间我都使用地图和集合来处理数据结构。密码实例不是数据结构,它们是执行特定操作的有状态类。
此外,我不喜欢使用不同软件组件的对象。将密码放在地图中建议使用具有不同目标的各种不同类别。这意味着您要在此类和多个组件之间创建紧密耦合。这不是一件好事。
也就是说,在课堂上重复使用像Cipher
这样的课程是没有错的。如果不应重复相对expensive key schedule of e.g. AES,这尤其有用。这取决于Cipher的实现如何处理它。在这些情况下,Cipher
的实例只是特定类的未显示的private
字段(例如,FileEncrypter
或类似字段),后续调用public
即可访问该字段方法。