使用java中的密钥库存储AES密钥

时间:2014-01-28 13:28:25

标签: java encryption aes keystore

我正在使用Java密钥库来存储AES加密的密钥。

final String strToEncrypt = "Hello World";
KeyGenerator kg = KeyGenerator.getInstance("AES");
kg.init(128);
SecretKey sk = kg.generateKey();
String secretKey = String.valueOf(Hex.encodeHex(sk.getEncoded()));   
//Storing AES Secret key in keystore
KeyStore ks = KeyStore.getInstance("JCEKS");
char[] password = "keystorepassword".toCharArray();
java.io.FileInputStream fis = null;
try {
  fis = new java.io.FileInputStream("keyStoreName");
  ks.load(fis, password);
} finally {
  if (fis != null) {
    fis.close();
  }

  KeyStore.ProtectionParameter protParam = 
    new KeyStore.PasswordProtection(password);

  KeyStore.SecretKeyEntry skEntry = new KeyStore.SecretKeyEntry(sk);
  ks.setEntry("secretKeyAlias", skEntry, protParam);

但我得到了以下异常。

  

线程“main”中的异常java.security.KeyStoreException:未初始化的密钥库
  在java.security.KeyStore.setEntry(未知来源)

如何解决此错误?提前致谢

2 个答案:

答案 0 :(得分:1)

根据KeyStore文档,

  

在访问密钥库之前,它必须是loaded

所以你正在加载KeyStore但是如果FileNotFoundException发生了怎么办? fis = new java.io.FileInputStream("keyStoreName");,因此如果文件不存在,我们会使用null加载KeyStore,例如ks.load(null,null);

答案 1 :(得分:-1)

您执行的行:

ks.load(null);

在try catch块中,可能导致它不能执行,所以当你到达这一行时会发生这种情况:

ks.setEntry("secretKeyAlias", skEntry, protParam);

KeyStore实际上没有初始化,因此也是例外。您的try-catch块用于处理FileInputStream异常,尝试在其外部移动KeyStore #load调用。