如何处理多个密码

时间:2013-08-23 13:21:24

标签: java performance cryptography

我正在考虑创建几个密码并将它们放在一个集合中。主要用于在创建密钥和初始化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);

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

2 个答案:

答案 0 :(得分:5)

不要过早优化。

创建Cipher实例并初始化它相对昂贵的操作时,请先测试它。只有在性能测试之后才能优化性能。

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

答案 1 :(得分:1)

我个人不喜欢将Cipher个实例放在Map中。大部分时间我都使用地图和集合来处理数据结构。密码实例不是数据结构,它们是执行特定操作的有状态类。

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

也就是说,在课堂上重复使用像Cipher这样的课程是没有错的。如果不应重复相对expensive key schedule of e.g. AES,这尤其有用。这取决于Cipher的实现如何处理它。在这些情况下,Cipher的实例只是特定类的未显示的private字段(例如,FileEncrypter或类似字段),后续调用public即可访问该字段方法。