我正在使用AES加密,并使用密钥生成器生成的密钥对消息进行加密。加密和解密正在按预期工作。但是,当应用程序重新启动时,我试图再次解密同一条消息,它会产生错误,因为秘密密钥没有存储在用于加密消息的任何地方,而在重新启动应用程序时,我们就没有那个密钥了。
无法调用javax.crypto.Cipher.getIV(),因为AES.encryptionCipher为null。
我不想把密匙存储在数据库里。我可以存储secretKey并将其写入一个文件中并将该文件放入src/main/ folder.Will中吗?这是一种很好的方法吗?
有没有其他地方可以存储秘密密钥,在解密会议时,我可以从那里加载密钥并解密消息。
到目前为止,这就是我所做的。
private static SecretKey key;
private static int KEY_SIZE = 128;
private static int T_LEN = 128;
private static Cipher encryptionCipher;
public static String encrypt(String message) {
byte[] messageInBytes = message.getBytes();
byte[] encryptedBytes = null;
try {
KeyGenerator generator = KeyGenerator.getInstance("AES");
generator.init(KEY_SIZE);
key = generator.generateKey();
encryptionCipher = Cipher.getInstance("AES/GCM/NoPadding");
encryptionCipher.init(Cipher.ENCRYPT_MODE, key);
encryptedBytes = encryptionCipher.doFinal(messageInBytes);
} catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
e.printStackTrace();
}
catch (IllegalBlockSizeException | BadPaddingException | InvalidKeyException e) {
e.printStackTrace();
}
return encode(encryptedBytes);
}
public static String decrypt(String encryptedMessage) {
byte[] messageInBytes = decode(encryptedMessage);
byte[] decryptedBytes = null;
try {
Cipher decryptionCipher = Cipher.getInstance("AES/GCM/NoPadding");
GCMParameterSpec spec = new GCMParameterSpec(T_LEN, encryptionCipher.getIV());
decryptionCipher.init(Cipher.DECRYPT_MODE, key, spec);
decryptedBytes = decryptionCipher.doFinal(messageInBytes);
} catch (NoSuchAlgorithmException | InvalidAlgorithmParameterException | NoSuchPaddingException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException | BadPaddingException | InvalidKeyException e) {
e.printStackTrace();
}
return new String(decryptedBytes);
}
private static String encode(byte[] data) {
return Base64.getEncoder().encodeToString(data);
}
private static byte[] decode(String data) {
return Base64.getDecoder().decode(data);
}发布于 2022-04-25 17:56:28
我也有过类似的情况,还有一些开放的部分。建议的解决方案解决了一些问题,但仍有一些未解决的问题,希望我们能够有共同的方法与专家的投入。
生成密钥的密钥工具
keytool -genseckey -alias aeskey -keyalg AES -keysize 128 -keypass password -keystore project.keystore -storetype pkcs12有关详细信息,请参阅甲骨文文档。
从Java Keystore检索密钥的参考源代码:
KeyStore ks = KeyStore.getInstance("pkcs12");
String keyStorePassword = appSecurityConfig.getJksPass(); //get keystore password from external configuration, like kubernetes secret
//appSecurityConfig is configuration class
char [] password = keyStorePassword.toCharArray();
ks.load(new FileInputStream(appSecurityConfig.getKeystoreFile()), password); //keystoreFile -> JKS file name
SecretKey secretKey = (SecretKey) ks.getKey("kskey", password); //kskey -> is secreykey aliashttps://stackoverflow.com/questions/72002494
复制相似问题