java - com.google.gson.Gson 类因 javax.crypto.SecretKey 而失败?

标签 java android gson javax.crypto

我在一些加密操作中存储了 SecretKey,稍后需要使用。存储时我将其转换为字符串:

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

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

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

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

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吗?

更新

Converting SecretKey to json string & vice versa using Gson is bad Idea as answered by jonathanrz below 我按照他的回答在android中写了两个实用函数来将SecretKey转换为字符串,反之亦然函数如下:

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

最佳答案

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

更新:在您编辑问题后,我看到您的输出不仅仅是一个字符串。所以你需要创建一个代表你的 json 的类,用它解析响应并用 translateKey 构造每个键。 GSON 只能解析一个 json,如果该类具有与 json 中的键具有相同名称和相同类型的属性,而 SecretKey 则不能。

更新 2:translateKey 无法从字符串创建键。从字符串创建键的选项是这样的:Converting Secret Key into a String and Vice Versa

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

相关文章:

java - 当窗口关闭时 Controller 会发生什么?

java - 如何在android中验证警报对话框中的文本框

java - 为所有应用程序 ListView android添加点击功能

android - 在gridview android中显示来自sd卡的图像

java - 如何使用 GSon 公开方法?

java - 无法正确将 JSON 对象转换为 Java 对象

java - 什么是缓存字符串?

Java 如何使用 ASM 删除字段?

java - Spring 3.X Java 7 线程安全日期/数字格式注入(inject)

java - 当元素可以是不同类型以供使用时,如何创建 JSON 数据结构