Storing AES Secret key using keystore in java

2019-03-29 21:40发布

I am using Java keystore to store the secret key for AES encryption.

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);

But i am getting following Exception.

Exception in thread "main" java.security.KeyStoreException: Uninitialized keystore
at java.security.KeyStore.setEntry(Unknown Source)

How to fix this error? Thanks in advance

2条回答
Juvenile、少年°
2楼-- · 2019-03-29 22:30

The line where you execute:

ks.load(null);

Is inside a try catch block which may cause it not to execute, so if that happens when you reach this line:

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

The KeyStore is in fact not initialized, and thus, the exception. Your try-catch block is there for to deal with the FileInputStream exceptions, try moving the KeyStore#load call outside of it.

查看更多
成全新的幸福
3楼-- · 2019-03-29 22:31

According to the KeyStore documentation ,

Before a keystore can be accessed, it must be loaded.

so you are loading the KeyStore but what if a FileNotFoundException occures at fis = new java.io.FileInputStream("keyStoreName"); , hence if file does not exist we load the KeyStore with null values ,like , ks.load(null,null); .

查看更多
登录 后发表回答