2012-02-17 25 views
23

Ricevo un'implementazione di crittografia con Cipher.getInstance(String algorithm). Ho l'impressione che i nomi di algoritmi disponibili che posso passare differiscano in base a quali librerie sono presenti nel mio classpath.Come posso elencare gli algoritmi Cipher disponibili?

Vorrei scrivere un semplice programma che possa essere eseguito con percorsi di classe diversi che elenchino i nomi di algoritmo Cipher disponibili. Quale metodo avrei bisogno di chiamare per ottenere questo elenco?

risposta

17

Una volta che ho un elenco di provider, come descritto nel post di JB Nizet, non ho ancora un elenco di algoritmi. Ho scoperto che ogni Provider funziona come un oggetto Proprietà e le Proprietà codificano i nomi degli algoritmi. Non sono del tutto chiaro se questo è il modo corretto per cercarli o meno, e cosa significano esattamente tutte le altre proprietà, ma ho appena scritto una routine che ha sputato tutte le proprietà a System.out e grepped per varie stringhe che descrivono cosa Stavo cercando fino a quando l'ho trovato.

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 lo stesso metodo ma con espressioni regolari per cercare algoritmi in diversi provider. La maggior parte delle volte è meglio guardare la lista perché la documentazione potrebbe essere obsoleta (o, in molti casi, nulla). La cosa più difficile è sapere quali sono gli algoritmi in realtà, poiché nessuna spiegazione viene fornita da nessuna parte. Nota che ci sono molti "alias" che potresti voler rimuovere dalla lista se stai solo controllando se è stato implementato un algoritmo. –

+0

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

15

Il dottore di Cipher.getInstance() dice:

Nota che l'elenco dei fornitori registrati possono essere recuperate tramite le Security.getProviders() Metodo

cliccando sul link porta alla doc di Provider, che ha un metodo getServices() documentato da:

Ottenere un set non modificabile di tutti i servizi suppor da questo fornitore.

E facendo clic sul collegamento si accede al documento del Provider che ha un metodo getAlgorithm().

Si noti che questo è un metodo molto empirico. Un metodo più logico sarebbe quello di leggere la documentazione delle librerie crittografiche che stai utilizzando. Deve contenere l'elenco degli algoritmi supportati.

Qualunque sia il metodo scelto, la lettura della documentazione è di grande aiuto.

+0

Grazie. Ho completamente trascurato il commento su Security.getProviders() quando ho letto la documentazione, ed ero piuttosto sconcertato perché sembrava che non ci fosse nulla dentro. – skiphoppy

Problemi correlati