2014-11-21 9 views
7

Che differenza c'è tra le classi SecretKey e SecretKeySpec in Java?Perché è necessario un SecretKeySpec quando si ricava una chiave da una password in Java?

La documentazione di SecretKeySpec dice:

può essere utilizzato per costruire una chiave segreta da un array di byte

In questo codice, se stampo secretKey.getEncoded() o secret.getEncoded(), in esadecimale poi entrambi danno la stessa uscita. Allora, perché abbiamo bisogno dello SecretKeySpec?

final String password = "test"; 
int pswdIterations = 65536 ; 
int keySize = 256; 
byte[] ivBytes; 
byte[] saltBytes = {0,1,2,3,4,5,6}; 

SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); 

PBEKeySpec spec = new PBEKeySpec(
        password.toCharArray(), 
        saltBytes, 
        pswdIterations, 
        keySize 
        ); 

SecretKey secretKey = factory.generateSecret(spec); 

SecretKeySpec secret = new SecretKeySpec(secretKey.getEncoded(),"AES"); 

Ecco l'output di entrambe le chiamate a getEncoded():

00367171843C185C043DDFB90AA97677F11D02B629DEAFC04F935419D832E697

risposta

10

Ogni SecretKey ha un nome di algoritmo associato. Non è possibile utilizzare un SecretKey con l'algoritmo "DES" in un contesto in cui è necessario un tasto AES, ad esempio.

Nel codice, la riga seguente produce una SecretKey:

SecretKey secretKey = factory.generateSecret(spec); 

Tuttavia, a questo punto, la chiave è non una chiave AES. Se si dovesse chiamare secretKey.getAlgorithm(), il risultato è "PBKDF2WithHmacSHA1". Hai bisogno di un modo per dire a Java che questo è in realtà un tasto AES.

Il modo più semplice per farlo è quello di costruire un nuovo SecretKeySpec oggetto, utilizzando i dati chiave originali e specificando esplicitamente il nome dell'algoritmo:

SecretKeySpec secret = new SecretKeySpec(secretKey.getEncoded(),"AES"); 

Nota: Io personalmente dichiarare secret come SecretKey, dal momento che non pensare che dovrai preoccuparti dell'attuazione concreta dopo questo.

+0

"Ogni chiave segreta ha un nome algoritmo associato." , non renderebbe la crittografia meno sicura? la chiave dovrebbe non dovrebbe essere indipendente dall'algoritmo? , ad esempio, se qualcuno ha preso la chiave, non sarebbe in grado di identificare l'algoritmo utilizzato per la crittografia? –

+8

La crittografia avanzata funziona sulla base del fatto che tutti sanno tutto, * tranne * il valore della chiave. Una volta che qualcuno ha la tua chiave, capire come hai crittografato i dati è un compito banale. Quindi no, il tuo algoritmo non deve essere segreto. –

7

secretkey è solo un'interfaccia che richiede l'attuazione specifica del provider. SecretKeySpec è una classe concreta che consente una facile costruzione di SecretKey dal materiale chiave esistente. Quindi, per ottenere SecretKey, è necessario utilizzare la classe factory appropriata o SecretKeySpec come scorciatoia.

3

SecretKey è un'interfaccia e SecretKeySpec è un'implementazione di SecretKey

Problemi correlati