2013-08-23 3 views
1

Я подумываю о создании нескольких Ciphers и помещении их в коллекцию. В основном для оптимизации при создании ключей и инициализации объекта 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); 

Хорошо/плохо? Как люди обрабатывают несколько разных ключей и шифров?

ответ

5

Не оптимизируйте преждевременно.

При создании экземпляра Cipher и его инициализации относительно дорогостоящая операция, сначала проверьте его. Только после тестирования производительности вы должны оптимизировать производительность.

Также обратите внимание, что Cipher не является потокобезопасным (и не является HashMap), если вы хотите использовать этот кеш в нескольких потоках.

+2

+1 для «небезопасного потока». Я видел системы, где люди это делали. Это могло бы вызвать проблему один раз в голубой луне, но потребовалось годы для того, чтобы кто-то наконец осознал первопричину. – Syon

+0

+1 полностью согласен с этим ответом. Я создал другой ответ по разным причинам, почему * не * для этого. –

1

Лично мне не нравится идея размещения Cipher экземпляров в Map. В большинстве случаев я использую карты и коллекции вообще для структур данных . Экземпляры Cipher не являются структурами данных, они являются классами с состоянием, которые выполняют определенное действие.

Кроме того, я не люблю использовать объекты различными программными компонентами. Помещение шифрования на карте предполагает использование различными классами с разными целями. Это означает, что вы создаете плотную связь между этим классом и несколькими компонентами. Это нехорошо.

В целом, существует несколько неправильных способов повторного использования класса, такого как Cipher внутри класса. Это особенно полезно, если относительно expensive key schedule of e.g. AES не следует повторять. Это зависит от реализации Cipher, как это обрабатывается. В этих случаях экземпляр Cipher представляет собой только private, неэкспонированное поле определенного класса (скажем, FileEncrypter или такое), к которому обращаются последующие вызовы к методу public.

Смежные вопросы