com.google.gson.gson类使用javax.crypto.SecretKey失败?

com.google.gson.gson类使用javax.crypto.SecretKey失败?,java,android,gson,javax.crypto,Java,Android,Gson,Javax.crypto,我在一些加密操作期间存储了SecretKey,以后需要使用。存储时,我将其转换为字符串: String keyAsString = new Gson().toJson(key); 但在检索以下代码时失败: SecretKey secKey = new Gson().fromJson(keyAsString, SecretKey.class); 此外,即使使用了详细的消息传递过滤器,我在LogCat中也没有得到任何提示。我尝试在try-catch中使用调试点围绕代码,如下所示(希望在调

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

String keyAsString = new Gson().toJson(key);
但在检索以下代码时失败:

   SecretKey secKey =  new Gson().fromJson(keyAsString, SecretKey.class);
此外,即使使用了详细的消息传递过滤器,我在LogCat中也没有得到任何提示。我尝试在try-catch中使用调试点围绕代码,如下所示(希望在调试过程中获得任何异常跟踪):

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

save for
SecretKey
上的json结构如下:

{
  "algorithm": "AES",
  "key": [
   integer1, integre2, ....
  ]
}
注:整数1,整数2。。。是出于安全考虑的实际数字,我不会公布原始结果数字

可能出了什么问题?是否不允许存储
SecretKey

更新

使用Gson将SecretKey转换为json字符串以及使用Gson将SecretKey转换为json字符串是个坏主意,正如jonathanrz在下面回答的那样,我遵循了他的答案,并在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");
}

您应该将密钥解析为字符串,然后使用来解析密钥

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


UPDATE2:translateKey无法从字符串创建键。从字符串创建密钥的选项如下:

您可以发布一个您试图解析的json示例吗?@jonathanrz请查看编辑后的问题除了使用Gson之外,android上是否还有其他安全的方法来存储SecretKey?有什么建议吗?@pcj您想将其存储在哪里?在SQLite数据库中,目前我正在将Gson字符串结果存储为SQLite db中的字符串&尝试使用Gson进行检索,但失败。@jonatharz非常感谢您救了我一命,当我们在LogCat中没有看到任何错误或异常消息且代码失败时,这很困难,再次感谢:)@pcj很乐意帮忙
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");
}