【问题标题】:Android SecretKey to String and backAndroid SecretKey 到字符串并返回
【发布时间】: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


【解决方案1】:

正如 cmets 所说。 toString() 不返回对象本身的表示,在这种情况下,而是一些变量。虽然它为每个字节数组返回不同的值,但使用 Base64.encodeToString(key.getEncoded(), Base64.DEFAULT) 将它们编码为 base65 会导致原始键及其副本的等效表示。

                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: ", Base64.encodeToString(key.getEncoded(), Base64.DEFAULT));
                Log.d("keyCopy string: ", Base64.encodeToString(keyCopy.getEncoded(), Base64.DEFAULT));

【讨论】:

    猜你喜欢
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    • 2013-08-04
    • 2015-05-24
    • 1970-01-01
    相关资源
    最近更新 更多