2015-04-02 3 views
2

У меня есть функция шифрования, которая всегда хорошо работала в различных средах, но в последнее время она кашляла странные результаты.Шифрование усечено

Вот код:

public static byte[] Encrypt(String pstrInput) throws Exception { 
    ByteArrayOutputStream ms; 
    CipherOutputStream encStream; 
    OutputStreamWriter sw; 
    byte[] buffer; 

    ms = new ByteArrayOutputStream(); 
    encStream = new CipherOutputStream(ms, getEncCipher()); 
    sw = new OutputStreamWriter(encStream); 

    try { 
     sw.write(pstrInput); 
     sw.write("\r\n"); 
     sw.close(); 
     encStream.close(); 
     ms.close(); 
     buffer = ms.toByteArray(); 
    } catch(IOException e) { 
     throw new Exception("Unexpected IO errors in Security Encrypt", e); 
    } 
    return buffer; 
} 

Проблема заключается в том, что в некоторых средах, buffer будет обрезан до 8 байт, и я понятия не имею, почему.

Я могу воспроизвести проблему на моей машине, комментируя строку encStream.close(), но я также не знаю, почему.

Насколько я знаю, машины, о которых идет речь (dev и QA), работают на одном и том же JVM (OpenJDK 1.7 64-bit). Единственное различие заключается в том, что dev-машина работает с кодом внутри Eclipse's Jetty, а QA работает с Tomcat, но это не должно меняться ...

Любые указатели?

+2

'0x3A28213A' ' '0x6339392C' 0x7363682E' – rbrtl

+1

Почему не вы закрываете потоки и писатель окончательно блокировать? –

+0

@AdriaanKoster Лучшие практики приятные и все, но я должен закрыть поток шифрования, где я это делаю, или он усекает. Усечение - это поведение, которое я пытаюсь понять и устранить. Закрытие в блоке finally не работает. –

ответ

2

Проблема не усеченный выход. Проблема заключается в добавлении мусора к выходу на машинах, где код «работает». Усеченная версия на самом деле правильная.

Закрытие записи потока закрывает основной поток. Кроме того, закрытие закрытого потока не должно иметь никакого эффекта.

Однако, похоже, есть ошибка с некоторыми версиями CipherStream, в результате чего ее закрытие на самом деле заставляет его скрывать и шифровать новый блок.

Именно поэтому комментирование encStream.close() «воссоздает» проблему (фактически фиксируя ее).

+0

Из спецификаций CipherStream не очевидно, какое правильное поведение. В любом случае, второй 'close' в моем коде действительно является ошибкой. Благодарю. –

+1

[Дополнительная информация] (http://bugs.java.com/bugdatabase/view_bug.do?bug_id=7160837) –

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