如何在Java KeyStore中存储一个简单的密钥字符串?

问题描述 投票:7回答:4

我的FS(S3 AWS密钥)上有一个文件,其中包含一个字符串,该字符串是我用于加密过程的密钥。

我想将它移动到Java KeyStore。

我知道如何使用keytool将证书导入KeyStore,但我找不到导入简单字符串键的方法。

你能帮我吗?

java keystore
4个回答
3
投票

我没有看到用keytool做到这一点的方法,但有些人在讨论,我想知道你是否可以在代码中存储和检索它作为PasswordBasedEncryption(PBE)SecretKey。 (免责声明:我自己没试过)。

驱动这种想法的资源:PBEKeySpec javadocCryptoSpec - Using Password Based Encryption example


12
投票

您可以使用PBE和JCEKS执行此操作。我认为你不能用JKS做到这一点。解:

创建一个密钥库来存储和获取条目:

keytool -keystore clientkeystore -genkey -alias client -storetype jceks

现在有一些代码来测试它。

   public static String getPasswordFromKeystore(String entry, String keystoreLocation, String keyStorePassword) throws Exception{

        KeyStore ks = KeyStore.getInstance("JCEKS");
        ks.load(null, keyStorePassword.toCharArray());
        KeyStore.PasswordProtection keyStorePP = new KeyStore.PasswordProtection(keyStorePassword.toCharArray());

        FileInputStream fIn = new FileInputStream(keystoreLocation);

        ks.load(fIn, keyStorePassword.toCharArray());

        SecretKeyFactory factory = SecretKeyFactory.getInstance("PBE");

        KeyStore.SecretKeyEntry ske =
                (KeyStore.SecretKeyEntry)ks.getEntry(entry, keyStorePP);

        PBEKeySpec keySpec = (PBEKeySpec)factory.getKeySpec(
                ske.getSecretKey(),
                PBEKeySpec.class);

        char[] password = keySpec.getPassword();

        return new String(password);

    }

    public static void makeNewKeystoreEntry(String entry, String entryPassword, String keyStoreLocation, String keyStorePassword)
            throws Exception {
        SecretKeyFactory factory = SecretKeyFactory.getInstance("PBE");
        SecretKey generatedSecret =
                factory.generateSecret(new PBEKeySpec(
                        entryPassword.toCharArray()));

        KeyStore ks = KeyStore.getInstance("JCEKS");
        ks.load(null, keyStorePassword.toCharArray());
        KeyStore.PasswordProtection keyStorePP = new KeyStore.PasswordProtection(keyStorePassword.toCharArray());

        ks.setEntry(entry, new KeyStore.SecretKeyEntry(
                generatedSecret), keyStorePP);

        FileOutputStream fos = new java.io.FileOutputStream(keyStoreLocation);
        ks.store(fos, keyStorePassword.toCharArray());
    }

2
投票

我知道这是旧的;但我遇到了同样的用例。

https://docs.oracle.com/javase/9/tools/keytool.htm#JSWOR-GUID-5990A2E4-78E3-47B7-AE75-6D1826259549

keystores有一个importpass选项,用于存储别名标识的KeyStore.SecretKeyEntry。

所以就是这样,你可以将你的字符串存储在一个别名中。


-1
投票

您无法在密钥库中导入任意字符串。在密钥库中,您可以导入java库用于远程主机身份验证的证书密钥。

© www.soinside.com 2019 - 2024. All rights reserved.