Java 如何导出对称加密密钥?

Java 如何导出对称加密密钥?,java,encryption,javax.crypto,Java,Encryption,Javax.crypto,我正在尝试在我的应用程序之间(通过Intnet)实现javax.crypto加密。我遵循这个(接受的答案):。问题是,据我所知,我需要在两个应用程序中使用相同的SecretKeySpec密钥,以便加密/解密数据。我不知道如何导出它(作为字符串或任何东西),然后在我的两个应用程序中硬编码。您可以使用getEncoded()方法导出SecretKey。这将返回一个字节数组,您可以将其编码为字符串,例如使用base64编码。可以从此编码字节数组重新创建SecretKeySpec对象 只是给你一个更好的

我正在尝试在我的应用程序之间(通过Intnet)实现
javax.crypto
加密。我遵循这个(接受的答案):。问题是,据我所知,我需要在两个应用程序中使用相同的
SecretKeySpec密钥
,以便加密/解密数据。我不知道如何导出它(作为字符串或任何东西),然后在我的两个应用程序中硬编码。

您可以使用
getEncoded()
方法导出
SecretKey
。这将返回一个字节数组,您可以将其编码为字符串,例如使用base64编码。可以从此编码字节数组重新创建
SecretKeySpec
对象

只是给你一个更好的想法,而不是测试:

初始生成和输出 导入/重新创建
为什么要硬编码?Java可以(在某种程度上)反编译成人类可读的格式。任何用于加密的硬编码密钥都是不安全的。(据我所知)我总是在我的应用程序上运行ProGuard,所以我希望这会给反编译增加一些困难。这是我在实践中第一次接触加密技术,所以我不知道如何管理这些密钥……您可以使用Diffie Hellman在每次应用程序必须相互通信时安全地交换密钥()。Java支持这种开箱即用的标准。好的,有可能重新创建一个只有密码短语的密钥吗?好的,您可以从密码短语中潜在地派生一个加密密钥。你能详细描述一下你想做什么吗?我只想在我的两个应用程序中“拥有”这个共享密钥,以便对消息进行加密/解密。请参阅这个问题中的公认答案:“对称加密”部分。啊,好的,你可以只使用他们的方法从密码短语中获取
SecretKeySpec
。在这种情况下,您需要导出
SecretKeySpec
用于什么?如果需要,我的方法应该可以正常工作,因为
SecretKeySpec
实现了
SecretKey
接口,并且具有
getEncoded()
方法。
import org.apache.commons.codec.binary.Base64;

// "AES" is the key generation algorith, you might want to use a different one.
KeyGenerator kg = KeyGenerator.getInstance("AES"); 

// 256-bit key, you may want more or fewer bits.
kg.init(256);

SecretKey key = kg.generateKey();
byte[] keyBytes = key.getEncoded();

// Encode to a String, e.g. base 64 encoded
String encodedKey = new String(Base64.encodeBase64(keyBytes), "UTF-8");
// Base 64 decode
byte[] keyBytes = Base64.decodeBase64(encodedKey.getBytes("UTF-8"));

// Need to put the same key generation algorithm in here:
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");