我正在尝试使用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”
我做错了什么?
答案 0 :(得分:1)
正如文件所述:
注意:必须在写入最后一个字节后关闭流,否则将省略最后的填充,结果数据将不完整/不一致。
完成写入后,您需要关闭流。
缺少的==
是最后的填充,因为base 64工作在3个字符的块中。如果长度不能被3整除,则使用一个或两个=
字符填充结果