繁体   English   中英

如何在JAVA中编码和解码SecretKey?

[英]How to encode and decode SecretKey in JAVA?

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

上面显示的代码试图将input编码为SecretKey并存储到keystore中。 下面显示的代码是我如何从密钥库中检索密钥。 但是我不知道如何将其解码回原始值?

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

我不确定这是否是对SecretKey进行加密和解密的正确方法,如果我错了,请纠正我。

回读这个Q / AI认为我已经读错了问题。

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


上面的代码中有几件事并不完全正确:

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

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

  3. 对于DES密钥,只要确保设置了奇偶校验位,就需要通过KeyFactory放置密钥规范。 他们将确保密钥有效。

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

如果加密密钥存储良好,则用于加密密钥的足够存储取决于用例和其他安全措施。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM