2012-03-18 13 views
5

Ho bisogno di sapere se è possibile recuperare una chiave da un KeyStore senza fornire lo 'storepass'. La documentazione here dice che "Quando si recuperano informazioni dal keystore, la password è opzionale; se viene data nessuna password, l'integrità delle informazioni recuperate non può essere controllato e viene visualizzato un avviso"KeyStore chiave get senza password

Tuttavia quando provo a ottengo la chiave senza password Ottengo "java.lang.IllegalArgumentException: password non può essere nulla" eccezione.

Di seguito è riportato come ho creato il KeyStore

keytool -genseckey -alias "myKey" -keystore KEYSTORE.jks -storepass "password" -storetype "JCEKS" -keyalg AES -keysize 128

E ho cercato di recuperare come segue

final KeyStore keyStore = KeyStore.getInstance("JCEKS"); 
keyStore.load(new FileInputStream(new File("C:\\temp\\keytool\\KEYSTORE.jks")), 
    null); 
final Key key = keyStore.getKey("myKey", null); 

che getta la seguente eccezione

java.lang.IllegalArgumentException: password can't be null 
at com.sun.crypto.provider.SunJCE_z.<init>(DashoA13*..) 
at com.sun.crypto.provider.JceKeyStore.engineGetKey(DashoA13*..) 
at java.security.KeyStore.getKey(KeyStore.java:763) 

Ho frainteso completamente la documentazione? C'è un altro modo per aggirare questo, perché non vedo il punto di memorizzare lo 'storepass' in chiaro nel mio codice in cui tutti possono vederlo, rendendo quindi la password inutile.

risposta

4

Se storepass (utilizzato per accedere alla chiave privata) non viene fornito, tenterà di utilizzare keypass, ovvero la password del keystore, che non viene fornita.
Ecco perché ottieni l'eccezione.
Non si può avere sia il nulla keypass e storepass
dal tuo link:

Per un'opzione -keypass, se non si specifica l'opzione sulla riga di comando , keytool sarà primo tentativo di utilizzare la password dell'archivio chiavi per recuperare la chiave privata/segreta, e se non funziona, poi chiederà voi per il/secret password della chiave privata

+0

Sì, sembra che io ho frainteso il d OCUMENTAZIONE. Quindi c'è un modo appropriato per aggirare questo? Non riesco proprio ad avere una password del genere nel codice. Grazie – Nishant

+0

Quindi il tuo problema è di evitare la password hardcoded nel codice? Questo è il problema più comune. Non puoi davvero fare molto. L'approccio consigliato in generale è richiedere la password all'utente. Se non puoi fare che puoi fare qualcosa di elaborato, ad es crittografare la password ma questo non ti aiuterà molto. Puoi anche delegare la responsabilità all'utente, ad esempio per mantenere il file system sicuro. – Cratylus