加密被截断

时间:2015-04-02 15:12:51

标签: java encryption

我有一个加密功能,在各种环境下一直运行良好,但最近,它一直在咳出奇怪的结果。

以下是代码:

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位)。唯一的区别是dev机器在Eclipse的Jetty中运行代码而QA正在运行Tomcat,但这不应该有任何区别......

任何指针?

1 个答案:

答案 0 :(得分:2)

问题不是截断输出。问题是垃圾被添加到代码“工作”的机器上的输出。截断的版本实际上是正确的版本。

关闭流编写器将关闭基础流。此外,关闭一个封闭的流不应该有任何影响。

但是,某些版本的CipherStream似乎存在错误,因此再次关闭它实际上会导致它刷新并加密新块。

这就是为什么注释掉encStream.close()“重新创建”问题(通过实际修复它)。