2012-02-17 12 views
23

Estoy obteniendo una implementación de Cipher con Cipher.getInstance(String algorithm). Tengo la impresión de que los nombres de los algoritmos disponibles que puedo aprobar difieren en función de las bibliotecas que están presentes en mi classpath.¿Cómo puedo enumerar los algoritmos de cifrado disponibles?

Me gustaría escribir un programa simple que pueda ejecutar con diferentes classpaths que enumerarán los nombres de algoritmo de Cipher disponibles. ¿Qué método necesitaría llamar para obtener esta lista?

Respuesta

17

Una vez que tengo una lista de proveedores, como se describe en la publicación de JB Nizet, todavía no tengo una lista de algoritmos. Encontré que cada Proveedor funciona como un objeto de Propiedades, y las Propiedades codifican los nombres de los algoritmos. No estoy del todo claro si esta es la forma correcta de buscarlos o no, y qué significa exactamente todas las otras propiedades, pero acabo de escribir una rutina que arrojó todas las propiedades a System.out y grepped para varias cadenas que describen lo que Estaba buscando hasta que lo encontré.

import java.security.*; 

for (Provider provider: Security.getProviders()) { 
    System.out.println(provider.getName()); 
    for (String key: provider.stringPropertyNames()) 
    System.out.println("\t" + key + "\t" + provider.getProperty(key)); 
} 
+1

Sí, uso el mismo método pero con expresiones regulares para buscar algoritmos en varios proveedores. La mayoría de las veces es mejor mirar la lista porque la documentación puede estar desactualizada (o, en muchos casos, nula). Lo difícil es saber cuáles son los algoritmos en realidad, por supuesto, ya que no se proporciona ninguna explicación en ninguna parte. Tenga en cuenta que hay muchos "alias" que es posible que desee eliminar de la lista si solo está comprobando si se ha implementado un algoritmo. –

+0

Ver http://stackoverflow.com/a/3683915/443515 – Qwerky

15

El documento de Cipher.getInstance() dice:

Tenga en cuenta que la lista de proveedores registrados puede ser recuperada a través de los Security.getProviders() Método

Al hacer clic en el enlace lleva a la doc de Proveedor, que tiene un método getServices() documentado por:

Obtenga un conjunto no modificable de todos los servicios de apoyo por este proveedor.

Y al hacer clic en el enlace se accede al documento del proveedor que tiene un método getAlgorithm().

Tenga en cuenta que este es un método muy empírico. Un método más lógico sería leer la documentación de las bibliotecas de cifrado que está utilizando. Debe contener la lista de algoritmos admitidos.

Independientemente del método que elija, leer la documentación ayuda mucho.

+0

Gracias. Pasé por alto por completo el comentario sobre Security.getProviders() cuando leí la documentación, y estaba algo desconcertado por qué parecía que no había nada allí. – skiphoppy

Cuestiones relacionadas