Java 来自输入流的MD5校验和
我试图获取输入流的md5和,但获取的字符串加密不正确 我得到的md5字符串是:Java 来自输入流的MD5校验和,java,md5,Java,Md5,我试图获取输入流的md5和,但获取的字符串加密不正确 我得到的md5字符串是:äE']aáTáŠJ 当它应该是:e48f0b45b545dd56102e12a54e08af64a 你能看出我做错了什么吗?以下是一个工作程序: import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStr
äE']aáTáŠJ
当它应该是:e48f0b45b545dd56102e12a54e08af64a
你能看出我做错了什么吗?以下是一个工作程序:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class main {
public static void main(String[] args) throws IOException {
byte[] fileContents = new byte[15 * 10000000];
FileOutputStream out = new FileOutputStream("C:\\testFile");
out.write(fileContents);
out.close();
File file = new File("C:\\testFile");
FileInputStream fs = new FileInputStream(file);
System.out.println(new String(getBytesOfMd5(fs)));
}
public static byte[] getBytesOfMd5(InputStream is) throws IOException {
byte[] buffer = new byte[1024];
MessageDigest complete = null;
try {
complete = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
return null;
}
int numRead;
do {
numRead = is.read(buffer);
if (numRead > 0) {
complete.update(buffer, 0, numRead);
}
} while (numRead != -1);
is.close();
return complete.digest();
}
}
方法digest()
以字节形式返回哈希值。然后您尝试将这些字节直接转换为字符串
您想要的是将每个字节转换为两个十六进制数字。代码如下:
byte[] hash = complete.digest();
StringBuilder sb = new StringBuilder();
for (byte b : hash)
sb.append(String.format("%02x", b & 0xFF));
String hexHash = sb.toString();
System.out.println(hexHash);
您只需将字节数组转换为十六进制:
import javax.xml.DatatypeConverter;
String hex = DatatypeConverter.printHexBinary(getBytesOfMd5(fs));
注意:您还可以使用
DigestInputStream
包装InputStream
,让它在读取流时自动为您计算摘要。您只需将字节数组转换为十六进制。。。在javax.xml.DatatypeConverter
中也有一个合适的方法(printHexBinary
),看看你说的“加密”类。MD5不是加密,而是散列函数。加密可以反转(使用密钥),哈希不能反转。确保哈希函数就是您想要的。对于每个字节,直接使用java.util.Formatter比使用String.format
要好。@VGR和使用javax.xml.DatatypeConvert.printHexBinary
会更好!这是一个标准的JDK函数。。。