我们的客户抱怨以纯文本形式存储在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)。 如何提取上面命令生成的密码?
答案 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));
}
}