java - 如何以编程方式在 Java 中生成和存储 HMacSHA256 key ?

标签 java cryptography keystore

我想生成一个 HMacSHA256 key 并将其存储在 Java keystore 中以供测试。

我通常会通过 key 工具执行此操作:

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

到目前为止,我发现我可以使用以下方法生成 key :

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

不幸的是,该 key 不是 PrivateKey 的实例,因此存储 key 失败:

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

异常(exception):

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 代表一个对称 key 。 PrivateKeyPublicKey 和私钥对的一部分。有没有办法存储单个对称 key ?

最佳答案

是的,你可以。但在 Java 9 发布之前,PKCS#12 key 存储的功能将受到限制。但是,您在命令行 keytool 中使用的 JCEKS key 存储支持对称 (HMAC) key :

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 上正常工作。

关于java - 如何以编程方式在 Java 中生成和存储 HMacSHA256 key ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43374319/

相关文章:

java - 如何实现 flyway-play Java 迁移

python - pycrypto:无法解密文件

android - 在公钥基础设施中使用 square okHTTP 库的 HTTPS/SSL

java - 将 JCEKS keystore 加载到 Vert.x

java - 无法执行 postMethod : Javax.net.ssl.SslException:被 CRL 撤销

java - 是否有非递归解决方案来获取字符串数组所有可能串联的列表?

java - 比较两个表中的值

Java:更喜欢取决于类实例或静态方法的实用程序类?

c# - RijndaelManaged 实例的用途?

c# - 我应该选择哪种加密哈希函数?