我在某些加密操作期间存储了SecretKey,以后需要使用它。在存储时,我将其转换为string:

String keyAsString = new Gson().toJson(key);


但是在检索时,以下代码失败:

   SecretKey secKey =  new Gson().fromJson(keyAsString, SecretKey.class);


另外,即使使用详细的消息过滤器,我在LogCat中也没有得到任何提示。我尝试将调试捕获中的代码包含在调试点中,如下所示(希望我在调试时可以得到任何异常跟踪):

try {
SecretKey secKey =  new Gson().fromJson(keyAsString, SecretKey.class); // One debug point here
} catch (Exception e) {
Log.e(TAG, Log.getStackTraceString(e)); // And one debug point here
}


但是调试器不会在两个调试点都停止,设备上的应用程序立即崩溃并不幸地显示了应用程序崩溃的消息。

SecretKey保存时的json结构如下:

{
  "algorithm": "AES",
  "key": [
   integer1, integre2, ....
  ]
}


注意:出于安全目的,integer1,integer2 ...是实际数字,我未发布原始结果数字。

可能出了什么问题?不允许这样存储SecretKey吗?

更新资料

使用Gson将SecretKey转换为json字符串,反之亦然是不好的主意,下面是jonathanrz的回答。

public static String secretKeyToString(SecretKey key) {
  return Base64.encodeToString(key.getEncoded(), Base64.DEFAULT);
}

public static SecretKey encodedStringToSecretKey(String encodedKey) {
  byte[] decodedKey = Base64.decode(encodedKey, Base64.DEFAULT);
  return new SecretKeySpec(decodedKey, 0, decodedKey.length, "AES");
}

最佳答案

您应该将密钥解析为字符串,然后使用SecretKeyFactory.translateKey解析密钥。

更新:在您编辑问题后,我看到您的输出不仅仅是一个String。因此,您将需要创建一个表示json的类,使用它解析响应,并使用translateKey构造每个键。如果类具有与json中的键具有相同名称和类型的属性,则GSON只能解析json,对于SecretKey则不是这样。

UPDATE2:translateKey无法从String创建键。从字符串创建密钥的选项是:Converting Secret Key into a String and Vice Versa

关于java - com.google.gson.Gson类因javax.crypto.SecretKey而失败?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44345808/

10-09 04:04