从oracle密钥库中提取存储的密码短语

时间:2019-03-07 13:02:32

标签: java cryptography keystore keytool privacy

我们的客户抱怨以纯文本形式存储在Tomcat context.xml中的加密密钥(当然,他现在是对的)。 而且他想使用外部密钥库来存储此加密密钥。

我能够使用以下命令创建密钥库并在其中放置对称密钥:

keytool -importpassword -alias encryption-key -keystore your.keystore -storetype pkcs12

此密钥库的类型为“ PSCS12”,实际上可以存储对称密钥。 我存储的密码有一个别名,即“加密密钥” 'your.keystore'是密钥库文件。

但是我有一个问题-我无法提取它。

如果我将尝试从Java代码中提取-那么我将需要提供salt和迭代次数,例如:

final SecretKey secretKey = (SecretKey) keyStore.getKey(alias, password.toCharArray());
    System.out.println("[*] Encryption algorithm: " + secretKey.getAlgorithm());


    Cipher cipher = Cipher.getInstance(secretKey.getAlgorithm());
    AlgorithmParameterSpec algorithmParameterSpec = new PBEParameterSpec(SALT, ITERATION_COUNT);

    cipher.init(Cipher.DECRYPT_MODE, secretKey, algorithmParameterSpec);
    String decryptedData = Arrays.toString(cipher.doFinal(secretKey.getEncoded()));
    System.out.println("Decrypted Key: " + decryptedData);

但是我不确定应该提供哪些值,因为我是使用命令行存储密码的。

正在使用的加密算法是PBEWithMD5AndDES。 我可以在调试器会话中看到存储的密码短语,实际上甚至可以看到密码短语的长度,但是我无法对其解密。

那么,我在这里有什么选择?客户希望有一个标准实施(JCA)。 如何提取上面命令生成的密码?

1 个答案:

答案 0 :(得分:0)

算了,我很傻。事实证明,我一直拥有正确的值,只是十六进制格式。

因此,如果您想拥有一个密钥库并在其中放置一些值(只是一个字符串,而不是密钥对),那么您将需要:

$ keytool -importpassword -alias encryption-key -keystore your.keystore -storetype pkcs12 -storepass testtest#创建一个密钥库并存储一个值

其中-importpassword用于存储单个密码

-alias是您的密码短语的别名

-keystore显然是密钥库文件

- storetype pkcs12用于存储对称密钥(只是密码短语,而不是密钥对)

-storepass是密钥库的密码(而不是密码)

然后您可以使用以下代码示例来提取密钥:

import javax.crypto.SecretKey;
import java.io.FileInputStream;
import java.nio.charset.StandardCharsets;
import java.security.KeyStore;

public class Main {
    private static final String WORKING_DIRECTORY = "/path/to/directory/where/keystore/is/placed/";
    private static final String FILE_NAME = "your.keystore";
    private static final String KEYSTORE_PASSWORD = "testtest";
    private static final String SECRET_KEY_ALIAS = "encryption-key";

    public static void main(String[] argv) throws Exception {
        final FileInputStream is = new FileInputStream(WORKING_DIRECTORY + FILE_NAME); // load a keystore from file
        final KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType()); // initialize a keystore
        keystore.load(is, KEYSTORE_PASSWORD.toCharArray()); // authorize in the keystore

        extract(SECRET_KEY_ALIAS, KEYSTORE_PASSWORD, keystore); // extract stored password from the keystore
    }

    static void extract(final String alias, final String password, final KeyStore keyStore) throws Exception {
        final SecretKey secretKey = (SecretKey) keyStore.getKey(alias, password.toCharArray());
        System.out.println("[*] Encryption algorithm: " + secretKey.getAlgorithm());

        System.out.println("[*] Converting stored key from HEX to string");
        System.out.println("[+] Stored key: " + new String(secretKey.getEncoded(), StandardCharsets.UTF_8));
    }
}