首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >应用程序启动时丢失的AES密钥

问应用程序启动时丢失的AES密钥
EN

Stack Overflow用户
提问于 2022-04-25 16:06:41
回答 1查看 130关注 0票数 1

我正在使用AES加密,并使用密钥生成器生成的密钥对消息进行加密。加密和解密正在按预期工作。但是,当应用程序重新启动时,我试图再次解密同一条消息,它会产生错误,因为秘密密钥没有存储在用于加密消息的任何地方,而在重新启动应用程序时,我们就没有那个密钥了。

无法调用javax.crypto.Cipher.getIV(),因为AES.encryptionCipher为null。

我不想把密匙存储在数据库里。我可以存储secretKey并将其写入一个文件中并将该文件放入src/main/ folder.Will中吗?这是一种很好的方法吗?

有没有其他地方可以存储秘密密钥,在解密会议时,我可以从那里加载密钥并解密消息。

到目前为止,这就是我所做的。

代码语言:javascript
复制
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);
}
EN

回答 1

Stack Overflow用户

发布于 2022-04-25 17:56:28

我也有过类似的情况,还有一些开放的部分。建议的解决方案解决了一些问题,但仍有一些未解决的问题,希望我们能够有共同的方法与专家的投入。

生成密钥的密钥工具

代码语言:javascript
复制
keytool -genseckey  -alias aeskey -keyalg AES -keysize 128  -keypass password -keystore project.keystore -storetype pkcs12

有关详细信息,请参阅甲骨文文档。

  • Java提供标准的Java密钥存储库(Java,jks ),在启动应用程序之前,秘密密钥可以存储在jks文件中,并且可以在重新启动时再次读取该文件。
  • JKS还需要密码来访问,在这种方法中,挑战在于如何安全地保存java keystore密码。
  • 我的建议是,keystore密码可以像kubernetes那样安全地保存在新平台中(还有其他建议吗?)

从Java Keystore检索密钥的参考源代码:

代码语言:javascript
复制
    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 alias
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72002494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档