【问题标题】:How do I clone a java keystore instance?如何克隆 java 密钥库实例?
【发布时间】:2019-07-29 08:35:39
【问题描述】:

我想克隆一个 java keystore 实例。

我将主密钥库写入 ByteArrayOutputStream 并将其刷新到字节数组。然后我创建了一个新的密钥库实例并从 byteArray 作为 ByteArrayInputStream 加载。它工作得很好。只是想知道是否有更好的方法。

我找不到任何这样做的例子。如果我以正确的方式做事,我认为发布它至少会帮助那些想做类似事情的人。

public static void test() throws KeyStoreException, NoSuchAlgorithmException,
            CertificateException, IOException, UnrecoverableKeyException
    {
        KeyStore originalKeyStore = KeyStore.getInstance( "JCEKS");
        originalKeyStore.load( null, "1234".toCharArray());
        Key originalKey = generateNewKey();
        originalKeyStore.setKeyEntry( "keyAlias", originalKey, "1234".toCharArray(), null);
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        originalKeyStore.store( os, "1234".toCharArray());

        ByteArrayInputStream is = new ByteArrayInputStream( os.toByteArray());
        KeyStore clonedKeyStore = KeyStore.getInstance( "JCEKS");
        clonedKeyStore.load( is, "1234".toCharArray());
        Key clonedKey = clonedKeyStore.getKey( "keyAlias", "1234".toCharArray());

        String encodedOriginalKey = Base64.getEncoder().encodeToString( originalKey.getEncoded());
        String encodedClonedKey = Base64.getEncoder().encodeToString( clonedKey.getEncoded());

        System.out.println( "Original key:" + encodedOriginalKey);
        System.out.println( "ClonedKey:" + encodedClonedKey);
        System.out.println( "Key equality:" + encodedClonedKey.compareTo( encodedOriginalKey));
    }

    public static Key generateNewKey() throws NoSuchAlgorithmException
    {
        KeyGenerator kgen = KeyGenerator.getInstance( "AES");
        kgen.init( 256, new SecureRandom());
        return kgen.generateKey();
    }

【问题讨论】:

  • 如果您的代码正常工作,这似乎是code review 的问题
  • @Michael 谢谢。不知道存在。

标签: java instance clone keystore


【解决方案1】:

通过深度克隆,您几乎可以复制所有内容。

深拷贝代码

public static Object clone(Object o) {
    try {
        ByteArrayOutputStream BAOS = new ByteArrayOutputStream();
        ObjectOutputStream OOS = new ObjectOutputStream(BAOS);
        OOS.writeObject(o);
        ByteArrayInputStream BAIS = new ByteArrayInputStream(BAOS.toByteArray());
        ObjectInputStream OIS = new ObjectInputStream(BAIS);
        return OIS.readObject();
    } catch (Exception e) {e.printStackTrace(); return null;}
}

【讨论】:

    猜你喜欢
    • 2019-10-27
    • 2023-01-09
    • 2014-06-07
    • 2011-01-12
    • 2017-05-19
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多