2015-12-23 3 views
3

Мне нужно декодировать массив символов Base64 без преобразования его в String. Массив символов - это пароль, и по соображениям безопасности мне не разрешено преобразовывать его в String (это требование не подлежит обсуждению).Безопасное декодирование массива символов Base64 в Java

java.util.Base64.Decoder. decode способ принимает byte[], ByteBuffer, и String, но не char[].

Проблемы безопасности использования строки для хранения конфиденциальных данных

на комментарий Джима Арчера

  • Строки неизменны
  • Они могут быть удалены только из памяти сборщика мусора (который не может быть принужден к этому)
+4

Вы можете использовать [этот ответ] (http://stackoverflow.com/a/9670279/1361506), чтобы преобразовать ваш 'символ []' в 'byte []' без промежуточной 'String', а затем вызывать' decode (byte []) '. – azurefrog

+0

Почему метод декодирования с использованием байтового массива непригоден? – Raedwald

+4

BTW, если вы (или кто-либо читающий) не знаете, проблема безопасности возникает из-за того, что (1) строки неизменяемы и (2) они висят, ожидая, когда GC их исправит, и вы не можете заставить GC для этого. С другой стороны, StringBuffer решает эту проблему, потому что вы можете уничтожить содержимое, когда закончите с ним. –

ответ

5

Создать CharBuffer при поддержке char[]. Затем используйте Charset.encode для кодирования байтового буфера в ByteBuffer. ByteBuffer принимается Base64 Decoder.

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

+0

Как узнать, какая кодировка символов используется? Он не указан в текущей реализации. – Groppe

+0

@Groppe Что является источником текста? – Adam

+0

Это пароль, предоставленный PasswordCallback.getPassword (javax.security.auth.callback), который заполняется в интерфейсе пользователем. – Groppe

Смежные вопросы