【问题标题】:How to export symmetric encryption key?如何导出对称加密密钥?
【发布时间】:2013-12-03 02:33:37
【问题描述】:

我正在尝试在我的应用程序之间实施javax.crypto 加密(通过 intnet)。我遵循这个(接受的答案):https://stackoverflow.com/questions/4319496/how-to-encrypt-and-decrypt-data-in-java。据我了解,问题是我需要在两个应用程序中使用相同的SecretKeySpec key 才能加密/解密数据。我不知道如何将它导出(作为字符串或任何东西),然后在我的两个应用程序中对其进行硬编码。

【问题讨论】:

  • 为什么要硬编码? Java 可以(在某种程度上)被反编译成人类可读的格式。任何用于加密的硬编码密钥都不安全。 (据我了解)
  • 我总是在我的应用程序上运行 ProGuard,所以我希望这会增加一些反编译的难度。这是我在实践中第一次接触加密,所以我不知道如何管理这些密钥......
  • 您可以使用 Diffie-Hellman 安全地在您的应用程序必须相互通信时交换密钥 (en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange)。 Java 开箱即用地支持此标准。

标签: java encryption javax.crypto


【解决方案1】:

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

只是为了给你一个更好的主意,未经测试:

初始生成和导出

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

【讨论】:

  • 好的,是否可以重新创建只有密码的密钥?
  • 嗯,您可以从密码短语中派生加密密钥。你能详细描述一下你想要做什么吗?
  • 我只想在我的两个应用程序中“拥有”这个共享密钥,以便加密/解密消息。
  • 查看此问题中接受的答案:stackoverflow.com/questions/4319496/…“对称加密”部分。
  • 啊,好吧,您可以使用他们的方法仅从密码中获取SecretKeySpec。在那种情况下,您需要导出 SecretKeySpec 做什么?如果需要,我的方法应该可以正常工作,因为SecretKeySpec 实现了SecretKey 接口并具有getEncoded() 方法。
猜你喜欢
  • 2016-11-02
  • 2015-02-08
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多