gpt4 book ai didi

java - AES key 编码 byte[] 到 String 并返回 byte[]

转载 作者:搜寻专家 更新时间:2023-11-01 01:30:18 27 4
gpt4 key购买 nike

在类似的问题"Conversion of byte[] into a String and then back to a byte[]"据说不执行 byte[] 到 String 和反向转换,看起来适用于大多数情况,主要是当您不知道使用的编码时。

但是,在我的例子中,我试图将 javax.crypto.SecretKey 数据保存到数据库中,并在之后恢复它。

该接口(interface)提供了一个方法 getEncoded(),它返回编码为 byte[] 的 key 数据,并且对于另一个类,我可以使用这个 byte[] 来恢复 key 。

那么,问题是,如何将 key 字节写成字符串,然后取回字节[]重新生成 key ?

最佳答案

javax.crypto.SecretKey是二进制数据,不能直接转成String。您可以将其编码为十六进制字符串或 Base64。

参见 Apache Commons Codec .

更新:如果您不想依赖第三方库(并且不能/不想存储纯二进制数据,正如 Jon 所建议的那样),您可以做一些特别的事情编码,例如,按照埃里克森的建议:

public static String bytesToString(byte[] b) {
byte[] b2 = new byte[b.length + 1];
b2[0] = 1;
System.arraycopy(b, 0, b2, 1, b.length);
return new BigInteger(b2).toString(36);
}

public static byte[] stringToBytes(String s) {
byte[] b2 = new BigInteger(s, 36).toByteArray();
return Arrays.copyOfRange(b2, 1, b2.length);
}

它相当丑陋、不标准且不是最佳的(在输出大小方面)。但它也非常小,正确并且没有依赖性;它可能很实用,特别是如果您的数据量很小。

更新:我根据 GregS 的评论将 Character.MAX_RADIX 替换为文字值 (36)。它可能看起来不太优雅,但实际上更安全。 (您也可以使用 32 或 16)。

关于java - AES key 编码 byte[] 到 String 并返回 byte[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2915224/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com