Para agrupar o no para agrupar los proveedores de servicios criptográficos de Java

SoluciónMessageDigest => crea nuevas instancias tan a menudo como sea necesarioKeyFactory => usar una sola instancia compartidaSecureRandom => use aStackObjectPoolCifrar => usar unStackObjectPoolPregunta

Me enfrento a un dilema regular mientras codifico la seguridadmarcos : "a la piscina o no a la piscina"

Básicamente esta pregunta se divide en dos "grupos":

Grupo 1 :SecureRandom porque la llamada anextBytes(...) está sincronizado y podría convertirse en un cuello de botella para una aplicación de aplicaciones web / multiproceso

Grupo 2: proveedores de servicios criptográficos comoMessageDigest, Signature, Cipher, KeyFactory, ... (debido al costo de lagetInstance() ?)

Cuál es tu opinión ?

¿Cuáles son tus hábitos en tales preguntas?

Editar 09/07/2013

Finalmente me tomé el tiempo para probar @QwerkyShare Clase por mi cuenta y el resultado me parece bastante ... sorprendente.

La clase carecía de mi principal preocupación: piscinas comoGenericObjectPool oStackObjectPool.

Así que he revisado la clase para probar las 4 alternativas:

Única instancia compartida con sincronización.esencianuevas instancias dentro de cada bucle (no estoy interesado en el caso en el que pueda extraer la creación del compendio fuera del bucle)esenciaGenericObjectPool:esenciaStackObjectPool:esencia

Tuve que reducir el número de bucles a 100000 ya que 1M estaba tomando demasiado tiempo con las agrupaciones.

También agregué unThread.yield() al final de cada bucle para dar a la carga una forma más agradable.

Resultados (tiempo de ejecución acumulativo):

Resumen del mensajenuevas instancias: 420 sÚnica instancia: 550 sStackObjectPool: 800 sGenericObjectPool: 1900 sKeyFactorynuevas instancias: 400sÚnica instancia: 350 sStackObjectPool: 2900 sGenericObjectPool: 3500 sSecureRandomStackObjectPool: 1600 snuevas instancias: 2300 sGenericObjectPool: 2300sUna sola instancia: 2800 sCifrarStackObjectPool: 2800 sGenericObjectPool: 3500 sÚnica instancia: 5100 snuevas instancias: 8000 sConclusión

Para MessageDigest y KeyFactory, los pools son asesinos de rendimiento y son incluso peores que una sola instancia con un cuello de botella de sincronización, mientras que son realmente útiles cuando se trata de SecureRandom y Cipher

Respuestas a la pregunta(2)

Su respuesta a la pregunta