簡體   English   中英

如何以編程方式生成和存儲Java中的HMacSHA256密鑰?

[英]How to programmatically generate and store HMacSHA256 key in Java?

我想生成並存儲HMacSHA256密鑰,以便在Java密鑰庫中進行測試。

我通常會通過keytool來做到這一點:

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

到目前為止,我發現我可以使用以下方法生成密鑰:

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

遺憾的是,該密鑰不是PrivateKey的實例,因此存儲密鑰失敗:

    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和Private-Key Pair的一部分。 有沒有辦法存儲單個對稱密鑰?

是的你可以。 但是在Java 9問世之前,PKCS#12密鑰庫的功能將受到限制。 但是,在命令行keytool中使用的JCEKS密鑰庫支持對稱(HMAC)密鑰:

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");
    }
}

應該在Java 8上正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM