首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将AES密钥编码的byte[]转换为字符串并返回到byte[]

将AES密钥编码的byte[]转换为字符串并返回到byte[]
EN

Stack Overflow用户
提问于 2010-05-27 01:13:57
回答 4查看 9.2K关注 0票数 4

在类似的问题中,"Conversion of byte[] into a String and then back to a byte[]"被认为不做byte[]到字符串和反向转换,看起来像什么适用于大多数情况,主要是当你不知道使用的编码时。

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

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

因此,问题是,我如何将密钥字节写为字符串,然后获取byte[]以重新生成密钥?

EN

Stack Overflow用户

回答已采纳

发布于 2010-05-27 01:22:53

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

参见Apache Commons Codec

更新:如果你不想依赖第三方库(并且不能/不想存储纯二进制数据,就像Jon建议的那样),你可以进行一些即席编码,例如,遵循erickson的建议:

代码语言:javascript
运行
复制
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的评论之后,我用文字值(36)替换了Character.MAX_RADIX。它可能看起来不那么优雅,但实际上更安全。(您也可以使用32或16)。

票数 6
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2915224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档