Sto provando a testare la crittografia/decodifica PBE. Ho scoperto che PBE genera la stessa chiave con diversi conteggi di sale e iterazione. Naturalmente, la password utilizzata è la stessa. Come ho capito, la stessa password e diverse sale/iterazione dovrebbero ottenere chiavi diverse. Qui di seguito è il mio codice di prova:Perché PBE genera la stessa chiave con un numero di sale e iterazione diverso?
import java.security.Key;
import java.security.SecureRandom;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
public class PBETest
{
public static void main(String[] args)
throws Exception
{
String algo = "PBEWithSHA1andDESede";
System.out.println("====== " + algo + " ======");
char[] password = "password".toCharArray();
SecureRandom rand = new SecureRandom();
byte[] salt = new byte[32];
rand.nextBytes(salt);
int iterationCount = rand.nextInt(2048);
//encryption key
PBEKeySpec encPBESpec = new PBEKeySpec(password, salt, iterationCount);
SecretKeyFactory encKeyFact = SecretKeyFactory.getInstance(algo);
Key encKey = encKeyFact.generateSecret(encPBESpec);
System.out.println("encryptioin iteration: " + iterationCount);
//decryption key
rand.nextBytes(salt);
iterationCount = rand.nextInt(2048);
PBEKeySpec decPBESpec = new PBEKeySpec(password, salt, iterationCount);
SecretKeyFactory decKeyFact = SecretKeyFactory.getInstance(algo);
Key decKey = decKeyFact.generateSecret(decPBESpec);
System.out.println("decryptioin iteration: " + iterationCount);
System.out.println("encryption key is same as decryption key? " + encKey.equals(decKey));
}
}
mi aspetto il risultato finale è un false
. Ho fatto qualcosa di sbagliato?
Grazie a tbroberg per la risposta. 1, "i conteggi di sali e iterazioni sono appena coincisi". I conteggi di sale e di iterazione sono generati casualmente e non penso che possano corrispondere per ogni corsa in questo test. 2, "ti sei appena fermato prima che il sale e il conteggio si riempissero del codice". Intendi dire che il conteggio di sale e iterazione ha effetto solo quando viene eseguita la crittografia/decrittografia? 3, ho trovato le chiavi sono sempre "70 61 73 73 77 6f 72 64". Penso che sia per "password", e non è legato al conteggio di sale o iterazione. È un risultato corretto? – Michael
# 2 e # 3 sembrano spiegare la situazione. Ho provato ad andare avanti per crittografare del testo, e i dati crittografati sono diversi ogni volta. Quindi la mia conclusione ora è: la chiave generata da SecretKeyFactory.generateSecret() è solo correlata alla password. Questo è vero almeno dal punto di vista del confronto, cioè key.getEncoded() è lo stesso. Il conteggio di sale e iterazione ha effetto quando si crittografa il testo normale. Grazie ancora per il vostro aiuto! – Michael
Eccellente! (Il n. 1 era uno scherzo). Se hai trovato la risposta utile, contrassegnala per favore. : ^) – tbroberg