Base64和MimeUtility之间的结果不同

时间:2016-12-10 21:23:55

标签: java encoding base64

我正在尝试使用Base64OutputStream和MimeUtility更新方法并运行稍微不同的结果。

原始方法如下:

private static String encodePassword(String password) {
    MessageDigest algorithm;
    try {
        algorithm = MessageDigest.getInstance("MD5");
        algorithm.reset();
        algorithm.update(password.getBytes());
        byte[] encrypted =  algorithm.digest();

        ByteArrayOutputStream out = new ByteArrayOutputStream();
        OutputStream encoder = MimeUtility.encode(out, "base64");

        encoder.write(encrypted);
        encoder.flush();
        return new String(out.toByteArray());
    } catch (NoSuchAlgorithmException e) {
        return "Bad Encryption";
    } catch (MessagingException e) {
        return "Bad Encryption";
    } catch (IOException e) {
        return "Bad Encryption";
    }

这是我更新的方法:

private static String encodePassword(String password) {
    MessageDigest algorithm;
    try {
        algorithm = MessageDigest.getInstance("MD5");
        algorithm.reset();
        algorithm.update(password.getBytes());
        byte[] encrypted =  algorithm.digest();

        ByteArrayOutputStream out = new ByteArrayOutputStream();
        OutputStream encoder = new Base64OutputStream(out);

        encoder.write(encrypted);
        encoder.flush();
        return new String(out.toByteArray());

    } catch (NoSuchAlgorithmException e) {
        return "Bad Encryption";
    } catch (IOException e) {
        return "Bad Encryption";
    }
}

第一种方法返回正确的加密:“ISMvKXpXpadDiUoOSoAfww ==” 第二个返回MOST - “ISMvKXpXpadDiUoOSoAf”

我做错了什么?

1 个答案:

答案 0 :(得分:1)

假设您正在使用https://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/binary/Base64OutputStream.html

正如文件所述:

  

注意:必须在写入最后一个字节后关闭流,否则将省略最后的填充,结果数据将不完整/不一致。

完成写入后,您需要关闭流。

缺少的==是最后的填充,因为base 64工作在3个字符的块中。如果长度不能被3整除,则使用一个或两个=字符填充结果