先贴以下代码:
package com.hua.md5.test;
import java.io.*;
import java.security.*;
public class HashFile {
/**
* @param args
*/
public static char[] hexChar = { '0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
public static void main(String[] args) {
String fileName = "F:\\soft\\Firefox.exe";
String hashType = "MD5";
try {
System.out.println(hashType + " == " + getHash(fileName, hashType));
hashType = "SHA1";
System.out.println(hashType + " == " + getHash(fileName, hashType));
hashType = "SHA-256";
System.out.println(hashType + " == " + getHash(fileName, hashType));
hashType = "SHA-384";
System.out.println(hashType + " == " + getHash(fileName, hashType));
hashType = "SHA-512";
System.out.println(hashType + " == " + getHash(fileName, hashType));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static String getHash(String fileName, String hashType)
throws Exception {
InputStream fis;
fis = new FileInputStream(fileName);
byte[] buffer = new byte[1024];
MessageDigest md5 = MessageDigest.getInstance(hashType);
int numRead = 0;
while ((numRead = fis.read(buffer)) > 0) {
md5.update(buffer, 0, numRead);
}
fis.close();
return toHexString(md5.digest());
}
public static String toHexString(byte[] b) {
StringBuilder sb = new StringBuilder(b.length * 2);
for (int i = 0; i < b.length; i++) {
sb.append(hexChar[(b[i] & 0xf0) >>> 4]);
sb.append(hexChar[b[i] & 0x0f]);
}
return sb.toString();
}
}
关于java的MD5算法:主要使用MessageDigest类。
public abstract class MessageDigestextends MessageDigestSpi
此 MessageDigest 类为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法。信息摘要是安全的单向哈希函数,它接收任意大小的数据,输出固定长度的哈希值。
MessageDigest 对象开始被初始化。该对象通过使用 update
方法处理数据。任何时候都可以调用 reset
方法重置摘要。一旦所有需要更新的数据都已经被更新了,应该调用 digest
方法之一完成哈希计算。
对于给定数量的更新数据,digest
方法只能被调用一次。digest
被调用后,MessageDigest 对象被重新设置成其初始状态。
代码解析:
String fileName = "F:\\soft\\Firefox.exe";//文件的位置
String hashType = "MD5"; //类型
try {
System.out.println(hashType + " == " + getHash(fileName, hashType));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
public static String getHash(String fileName, String hashType)
throws Exception {
InputStream fis;
fis = new FileInputStream(fileName);//读取文件
byte[] buffer = new byte[1024];
MessageDigest md5 = MessageDigest.getInstance(hashType);
int numRead = 0;
while ((numRead = fis.read(buffer)) > 0) {
md5.update(buffer, 0, numRead);
}
fis.close();
return toHexString(md5.digest());
}
getInstance()方法
public static MessageDigest getInstance (String algorithm) throws NoSuchAlgorithmException
- 生成实现指定摘要算法的 MessageDigest 对象。如果默认的提供程序包提供所请求的摘要算法的实现,则返回包含该实现的 MessageDigest 的实例。如果默认包中不存在该算法,则搜索其他包。
-
参数:
-
algorithm
- 所请求算法的名称。有关标准算法名称的信息,请参阅《Java Cryptography Architecture API Specification & Reference 》中的附录 A。
返回:
- 实现指定算法的 Message Digest 对象。 抛出:
-
NoSuchAlgorithmException
- 如果算法在调用方环境中不可用。
-
public static MessageDigest getInstance (String algorithm, String provider) throws NoSuchAlgorithmException , NoSuchProviderException
- 生成实现指定提供程序提供的指定算法的 MessageDigest 对象,如果该算法可从指定的提供程序得到的话。
-
-
参数:
-
algorithm
- 所请求算法的名称。有关标准算法名称的信息,请参阅《Java Cryptography Architecture API Specification & Reference 》中的附录 A。 -
provider
- 提供程序的名称。
返回:
- 实现指定算法的 Message Digest 对象。 抛出:
-
NoSuchAlgorithmException
- 如果请求的提供程序提供的包中不存在该算法。 -
NoSuchProviderException
- 如果提供程序在环境中不可用。 -
IllegalArgumentException
- 如果提供程序的名称为 null 或空。 - update()方法:
-
update
public void update (byte input)
- 使用指定的字节更新摘要。
-
参数:
-
input
- 用于更新摘要的字节。
-
<!-- -->update
public void update (byte[] input, int offset, int len)
-
- 使用指定的字节数组,从指定的偏移量开始更新摘要。
-
参数:
-
input
- 字节数组。 -
offset
- 字节数组中的偏移量,操作从此处开始。 -
len
- 要使用的字节数,始于offset
。
-
update
public void update (byte[] input)
- 使用指定的字节数组更新摘要。
-
参数:
-
input
- 字节数组。
-
update
public final void update (ByteBuffer input)
- 使用指定的 ByteBuffer 更新摘要。使用始于
input.position()
处的input.remaining()
个字节更新摘要。一旦返回,该缓冲区的位置将等于它的界限;它的界限将不会更改。 -
-
参数:
-
input
- ByteBuffer
从以下版本开始:
- 1.5
-
digest
public byte[] digest ()
- 通过执行诸如填充之类的最终操作完成哈希计算。调用此方法后摘要被重置。
-
返回:
- 存放哈希值结果的字节数组。
<!-- -->digest
public int digest (byte[] buf, int offset, int len) throws DigestException
-
- 通过执行诸如填充之类的最终操作完成哈希计算。调用此方法后摘要被重置。
-
参数:
-
buf
- 存放计算摘要的输出缓冲区 -
offset
- 输出缓冲区中的偏移量,从此处开始存储摘要。 -
len
- 在 buf 中分配给摘要的字节数
返回:
- 放到
buf
中的字节数
抛出:
-
DigestException
- 如果发生错误。
-
digest
public byte[] digest (byte[] input)
- 使用指定的字节数组对摘要进行最后更新,然后完成摘要计算。也就是说,此方法首先调用
update(input)
,向update
方法传递 input 数组,然后调用digest()
。 -
参数:
-
input
- 在完成摘要计算前要更新的输入。
返回:
- 存放哈希值结果的字节数组。
-