【发布时间】:2021-10-21 14:13:32
【问题描述】:
我需要知道如何生成 SecretKey 的 String 并将其转换回 SecretKey。
我首先使用 KeyGenerator 生成了一个 SecretKey,如下面的代码所示,我使用它并且它工作正常,但我还使用 getEncoded() 将 SecretKey 保存为私有值。现在,当我重新生成 SecretKey 并在我的代码中使用它时,我得到了错误:
W/System.err:java.security.InvalidKeyException:不支持的密钥大小:43 字节
我认为下面的代码应该记录两个等效的字符串,但事实并非如此。
KeyGenerator keyGen = null;
keyGen = KeyGenerator.getInstance("AES");
keyGen.init(256);
SecretKey key= keygen.generateKey();
byte[] keyBytes = key.getEncoded();
SecretKey keyCopy = new SecretKeySpec(keyBytes, "AES");
Log.d("key string: ", key.getEncoded().toString());
Log.d("keyCopy string: ", keyCopy.getEncoded().toString());
根据 cmets,我将上述代码从 byte[] keyBytes = key.getEncoded().toString().getBytes(); 编辑为 byte[] keyBytes = key.getEncoded(); 删除冗余。
【问题讨论】:
-
在 Java 中,对字节数组调用
toString()方法不会提供有关内容的有用信息。byte[] keyBytes= key.getEncoded()有道理,byte[] keyBytes= key.getEncoded().toString().getBytes()没有。 -
一般来说,String 没有比 byte[] 更好的地方。如果您尝试将 byte[] 转换为 String,您应该能够解释原因。如果这样做有意义,那么答案通常是对字节数组进行base64编码以获取字符串,然后对字符串进行base64解码以再次获取返回数组。有时使用十六进制编码而不是 base64。
-
出于我的目的,我将使用由 base64 编码的字节 [] 制成的字符串,但目前即使是字节数组也没有返回相等的值。
-
假设
toString()正在返回输入的表示,而没有其他一些随机变量。 -
它没有,
[B.toString()返回类型和引用的编码,它根本不包含有关实际值的任何信息。这里[B是字节数组的运行时类型。
标签: android encryption secret-key