2017-04-12 5 views
3

Java 키 스토어에서 테스트 목적으로 HMacSHA256 키를 생성하고 저장하고 싶습니다.프로그래밍 방식으로 Java에서 HMacSHA256 키를 생성하고 저장하는 방법?

나는 일반적으로 키 도구를 통해이 작업을 수행 할 것입니다 :

SecretKey key = new SecretKeySpec("secret".getBytes(), "HmacSHA256"); 

을 그 키가 불행하게도 PrivateKey 따라서의 인스턴스가 아닌 :

keytool -genseckey -keystore keystore.jceks -storetype jceks -storepass secret -keyalg HMacSHA256 -keysize 2048 -alias HS256 -keypass secret 

지금까지 내가 사용하여 키를 생성 할 수 있다는 것을 발견 키 저장 실패 :

KeyStore ks = ... 
    ks.setEntry("HS256", new SecretKeyEntry(key), new PasswordProtection("secret".toCharArray())); 

예외 :

java.security.KeyStoreException: Cannot store non-PrivateKeys 
    at sun.security.provider.JavaKeyStore.engineSetKeyEntry(JavaKeyStore.java:258) 
    at sun.security.provider.JavaKeyStore$JKS.engineSetKeyEntry(JavaKeyStore.java:56) 
    at java.security.KeyStoreSpi.engineSetEntry(KeyStoreSpi.java:550) 
    at sun.security.provider.KeyStoreDelegator.engineSetEntry(KeyStoreDelegator.java:179) 
    at sun.security.provider.JavaKeyStore$DualFormatJKS.engineSetEntry(JavaKeyStore.java:70) 
    at java.security.KeyStore.setEntry(KeyStore.java:1557) 
    at com.gentics.mesh.SecretKeyTest.testSHA(SecretKeyTest.java:31) 

저는 SecretKey이 대칭 키를 나타냅니다. PrivateKeyPublicKey 및 개인 키 쌍의 일부입니다. 단일 대칭 키를 저장하는 방법이 있습니까?

답변

3

예, 가능합니다. 그러나 Java 9이 나올 때까지 PKCS # 12 키 저장소의 기능은 제한적입니다. JCEKS 키 저장소는 그러나 대칭 (HMAC) 키를 지원하는 않는 명령 줄 keytool에 사용하는 같이

public class HMACKeyStore { 
    public static void gen(String thePath, String thePassword) throws Exception { 
     KeyGenerator keygen = KeyGenerator.getInstance("HmacSHA256"); 
     SecretKey key = keygen.generateKey(); 

     KeyStore keystore = KeyStore.getInstance("jceks"); 
     keystore.load(null, null); 

     // This call throws an exception 
     keystore.setKeyEntry("theKey", key, thePassword.toCharArray(), null); 
     keystore.store(new FileOutputStream(thePath), thePassword.toCharArray()); 

     SecretKey keyRetrieved = (SecretKey) keystore.getKey("theKey", thePassword.toCharArray()); 
     System.out.println(keyRetrieved.getAlgorithm()); 
    } 

    public static void main(String[] args) throws Exception { 
     gen("hmac_store.jceks", "password"); 
    } 
} 

자바 8. 잘 작동합니다