【问题标题】:Securely decoding a Base64 character array in Java在 Java 中安全地解码 Base64 字符数组
【发布时间】:2016-03-30 04:25:52
【问题描述】:

我需要解码 Base64 字符数组而不将其转换为 String。 char 数组是密码,出于安全原因,我不允许将其转换为字符串(此要求不可协商)。

java.util.Base64.Decoder.decode 方法接受 byte[]ByteBufferString,但不接受 char[]

使用字符串存储敏感数据的安全问题

根据 Jim Archer 的评论

  • 字符串是不可变的
  • 它们只能由垃圾收集器从内存中清除(不能强制这样做)

【问题讨论】:

  • 您可以使用this answer 将您的char[] 转换为没有中间Stringbyte[],然后调用decode(byte[])
  • 为什么使用字节数组的解码方式不合适?
  • 顺便说一句,如果您(或任何阅读者)不知道,安全问题源于以下事实:(1)字符串是不可变的,(2)它们等待 GC 回收它们,并且您不能强制 GC 执行此操作。另一方面,StringBuffer 解决了这个问题,因为您可以在完成后销毁内容。
  • @JimArcher 你如何销毁StringBuffer 的内容? CharBuffer 也可以做同样的事情吗? CharBuffer 有一个 clear() 方法,但不能保证删除内容。我的部分问题在这里得到了回答:stackoverflow.com/questions/5513144/converting-char-to-byte/…
  • @Roland 以下是我想到的两种方法:sb.delete(0, sb.length());和 sb.setLength(0); setLength 方法会将内容设置为 \u0000。

标签: java security char base64 decode


【解决方案1】:

创建一个由char[] 支持的CharBuffer。然后使用Charset.encode 将字节缓冲区编码为ByteBufferBase64 Decoder 接受一个 ByteBuffer。

private static final java.util.Base64.Decoder BASE_64_DECODER= new java.util.Base64.Decoder();

private static final String ENCODING = "UTF-8";// Use the correct encoding here.

private byte[] decodePassword(char[] password) {
    CharBuffer charBuffer = CharBuffer.wrap(password);
    ByteBuffer byteBuffer = Charset.forName(ENCODING).encode(charBuffer);
    return BASE_64_DECODER.decode(byteBuffer);
}

受 azurefox 的评论和此处答案的启发:https://stackoverflow.com/a/9670279/1361506

【讨论】:

  • 我如何知道要使用哪个字符编码集?当前实现中没有指定。
  • @Groppe 文字出处是什么?
  • 是PasswordCallback.getPassword (javax.security.auth.callback)提供的密码,由用户输入填充到界面中。
  • @Groppe 我不确定。我的猜测是它使用了表单帖子中使用的编码。您可以将其设置为 UTF-8:stackoverflow.com/a/708942/284685
  • 哦,哇...有趣的是 decode(ByteBuffer) 如何在不复制的情况下工作,但 encode(ByteBuffer) 却不行。我曾假设因为 encode() 没有安全地处理它,所以 decode() 也是如此。但我想事情不必完全对称。
猜你喜欢
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多