0
KeyStore ks = KeyStore.getInstance("JCEKS");
ks.load(null, null);
SecretKey skInput = new SecretKeySpec("input".getBytes(), "DESede");
SecretKeyEntry skeInput = new KeyStore.SecretKeyEntry(skInput);
ks.setEntry("input_key", skeInput, new KeyStore.PasswordProtection("banana".toCharArray()));
FileOutputStream fos = new FileOutputStream("my.keystore");
pambks.store(fos, "password".toCharArray());
fos.flush();
fos.close();

The code shown above is trying to encode the input into a SecretKey and store into keystore. The code shown below is how I retrieve the key from keystore. But I do not know how to decode it back to original value?

FileInputStream fin = new FileInputStream("my.keystore");
KeyStore ks = KeyStore.getInstance("JCEKS");
ks.load(fin, "password".toCharArray());
SecretKeyEntry ske = (SecretKeyEntry) readks.getEntry("input_key", new KeyStore.PasswordProtection("banana".toCharArray()));
SecretKey sk = ske.getSecretKey();

I wasn't sure whether this is the correct way of doing encryption and decryption to SecretKey, please correct me if I'm wrong.

4

1 回答 1

1

重读这个 Q/AI 认为我误读了这个问题。

您可以通过在密钥上调用 getEncoded 方法来获取密钥的字节表示形式。之后,可以使用 String 构造函数之一将其恢复为文本。如前所述,您不应该使用字符串作为键。请注意,DES 密钥在最后一位中包含奇偶校验,因此这可能会改变结果。要使用字符串作为键,最好使用十六进制。请注意,键应该有足够的熵,而字符串不可能提供。


上面的代码中有几处不完全正确:

  1. 你不应该(永远)使用"input".getBytes(). 首先,getBytes()使用平台特定的默认字符编码。如果您想将 DES 密钥用作字符串,请使用十六进制解码器对其进行解码(例如,在 Apache Commons 编解码器或 Bouncy Castle 中)。

  2. 您应该为 DESede 密钥使用 24 个字节。"input".getBytes()没有返回足够的字节。

  3. 对于 DES 密钥,将密钥规范通过KeyFactoryif 只是为了确保设置了奇偶校验位。他们将确保密钥有效。

要获得大量密钥数据,请使用 PBKDF2 作为密码或使用随机生成的密钥。

加密密钥存储是否足以存储加密密钥取决于用例和其他安全措施。

于 2013-07-26T02:13:44.677 回答