2014-10-09 17 views
5

Ho una chiave master in un HSM e voglio derivarla con un dato diversificatore. Sono abbastanza nuovo per JCA/JCE e un po 'perso con KeyGenerator, SecretKeyFactory, ... soprattutto perché tutti i parametri sono stringhe. Voglio usare AES o HmacSha1. Sembra che ho bisogno di usare un SecretKeyFactory e fornire un KeySpecs. Ma quale tipo di KeySpec?Come derivare una chiave con JCA/JCE e con un HSM

(ho visto un post su questo argomento, ma non mi sembrava un HSM è stato utilizzato.)

Grazie.

risposta

2

È possibile derivare chiave utilizzando:

per utilizzare HSM dalle API JCA/JCE, è necessario aggiungere il provider corrispondente alle API JCA/JCE e quindi specificare il parametro provider per richiedere quello specifico implementatore del provider sopra.

Ad esempio:

int slot = 0; 
Provider provider = new au.com.safenet.crypto.provider.SAFENETProvider(slot); 
Security.addProvider(provider); 
final String PROVIDER = provider.getName(); // "SAFENET", "SAFENET.1", ... 

KeyGenerator keyGen = KeyGenerator.getInstance("DESede", PROVIDER); 
Key baseKey = keyGen.generateKey(); 

Cipher desCipher = Cipher.getInstance("DESede/CBC/PKCS5Padding", PROVIDER); 
desCipher.init(Cipher.ENCRYPT_MODE, baseKey); 

byte[] derived = desCipher.doFinal("diversification data".getBytes()); 

Nota che se avete bisogno di fare derivazione della chiave, molto spesso, si potrebbe considerare di usare PCKS del proprio operatore di # 11 wrapper per Java (ad esempio jcprov da SafeNet) o altre API in modo che tu possa essere più esplicito sulla sua gestione delle sessioni ed essere più efficiente sull'uso delle risorse.