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
"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? –
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. –