извлечь сохраненную ключевую фразу из хранилища ключей оракула - PullRequest
0 голосов
/ 07 марта 2019

Наш клиент жалуется на то, что ключ шифрования хранится в Tomcat context.xml в виде простого текста (ну, он определенно прав в этом пункте). И он хочет использовать внешнее хранилище ключей для хранения этого ключа шифрования.

Мне удалось создать хранилище ключей и поместить туда симметричный ключ с помощью следующей команды:

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

Это хранилище ключей имеет тип 'PSCS12' и, фактически, может хранить симметричные ключи. Мой сохраненный пароль имеет псевдоним 'Ключ шифрования' . 'your.keystore' - это файл хранилища ключей.

Но у меня проблема - Я не могу ее извлечь.

Если я попытаюсь извлечь его из java-кода - тогда мне нужно будет указать число итераций, например:

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 голосов
/ 07 марта 2019

забудь, я тупой. получается, что у меня всегда было правильное значение, просто оно было в формате HEX.

Итак, если вы хотите иметь хранилище ключей и поместить туда какое-то значение (просто строка, а не пара ключей), вам потребуется:

$ 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));
    }
}
...