消息摘要简单介绍
消息摘要算法的主要特征是加密过程不需要密钥,并且经过加密的数据无法被解密,只有输入相同的明文数据经过相同的消息摘要算法才能得到相同的密文。消息摘要算法不存在密钥的管理与分发问题,适合于分布式网络相同上使用。由于其加密计算的工作量相当可观,所以以前的这种算法通常只用于数据量有限的情况下的加密,例如计算机的口令就是用不可逆加密算法加密的。近年来,随着计算机相同性能的飞速改善,加密速度不再成为限制这种加密技术发展的桎梏,因而消息摘要算法应用的领域不断增加。现在,消息摘要算法主要应用在“数字签名”领域,作为对明文的摘要算法。著名的摘要算法有RSA公司的MD5算法和SHA-1算法及其大量的变体。消息摘要返回的这些比特看上去是胡乱的杂凑在一起的。可以用大量的输入来检验其输出是否相同,一般,不同的输入会有不同的输出,而且输出的摘要消息可以通过随机性检验。但是,一个摘要并不是真正随机的,因为用相同的算法对相同的消息求两次摘要,其结果必然相同;而若是真正随机的,则无论如何都是无法重现的。因此消息摘要是“伪随机的”。
预知专业的算法介绍,需参考专业书籍。
找出系统支持的消息摘要算法
package date0803;
/**
* 找出系统支持的消息摘要算法
*/
import java.security.Security;
public class PrintMessageDigestAlgorithmsAvailable {
public static void main(String[] args) {
System.out.println("---------系统支持的消息摘要算法有--------");
for (String s : Security.getAlgorithms("MessageDigest")) {
System.out.println(s);
}
}
}
支持的算法有:
---------系统支持的消息摘要算法有--------
SHA-384
SHA-224
SHA-256
MD2
SHA
SHA-512
MD5
获取消息摘要的线程创建
package date0803;
/**
* 编写一个程序来计算文件的消息摘要
* 使用线程,便于批量计算文件的消息摘要
* @author zzw922cn
*/
import java.io.FileInputStream;
import java.io.IOException;
import java.security.DigestInputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import javax.xml.bind.DatatypeConverter;
public class FileDigestThread extends Thread {
private String filename;
/**
*
* @param filename 文件名
*/
public FileDigestThread(String filename) {
super();
this.filename = filename;
}
/**
* 线程的主要方法
*/
@Override
public void run() {
try {
//文件输入流
FileInputStream fileInputStream = new FileInputStream(filename);
//指定算法,创建消息摘要的单例
MessageDigest instance = MessageDigest.getInstance("SHA");
// MessageDigest instance = MessageDigest.getInstance("SHA-512");
// MessageDigest instance = MessageDigest.getInstance("SHA-384");
// MessageDigest instance = MessageDigest.getInstance("SHA-256");
// MessageDigest instance = MessageDigest.getInstance("SHA-224");
// MessageDigest instance = MessageDigest.getInstance("MD5");
// MessageDigest instance = MessageDigest.getInstance("MD2");
//创建摘要输入流,即从特定输入流和消息摘要来创建
DigestInputStream digestInputStream = new DigestInputStream(fileInputStream, instance);
//读取字节,并且更新摘要,然后关闭流
while(digestInputStream.read()!=-1)
;
digestInputStream.close();
//当所有数据已被更新,调用digest()方法完成哈希计算,返回字节数组
byte[] digest = instance.digest();
//创建字符串构造器,方便字符串的操作
StringBuilder stringBuilder = new StringBuilder(filename);
String algorithm = instance.getAlgorithm();
stringBuilder.append("(algorithm:"+algorithm+"):");
//将字节数组转化成字符串
stringBuilder.append(DatatypeConverter.printHexBinary(digest));
//打印消息摘要结果
System.out.println(stringBuilder.toString());
}catch(IOException ex) {
System.err.println(ex);
} catch (NoSuchAlgorithmException ex) {
System.err.println(ex);
}
}
}
运行实例
package date0803;
import java.io.File;
public class Test1 {
public static void main(String[] args) {
File file = new File("E:\\数据挖掘课程PPT");
File[] listFiles = file.listFiles();
//对于文件,使用绝对路径,便于查找
for(File subfile:listFiles) {
String absolutePath = subfile.getAbsolutePath();
Thread fileDigestThread = new FileDigestThread(absolutePath);
fileDigestThread.start();
}
}
}
运行结果
E:\数据挖掘课程PPT\4LANG.pdf(algorithm:SHA):175561E04F5A14DE82A5557C0EA036831EA5633A
E:\数据挖掘课程PPT\1intro.pdf(algorithm:SHA):0F8D1449BA7C195BF7AAADC1351ED02882F7B579
E:\数据挖掘课程PPT\3PREP.pdf(algorithm:SHA):C85278213C0D649355870E6D637D5198DD73B33B
E:\数据挖掘课程PPT\5DESC.pdf(algorithm:SHA):58A7F200CDDDA44D09E1F5514C8AA279E3E6E3FE
E:\数据挖掘课程PPT\2dw.pdf(algorithm:SHA):15D08FD207C2A680A529C7C18D847CC455E2080A
E:\数据挖掘课程PPT\7CLASS.pdf(algorithm:SHA):61CEB6DA12E75AF81EE84B15CBE2E4D23782993B
E:\数据挖掘课程PPT\8CLST.pdf(algorithm:SHA):B6AFE6FC67EE89E89860B7CF13B9550B9DCDF4FE
E:\数据挖掘课程PPT\10APPL.pdf(algorithm:SHA):8C6429D5A1DB0D8CE4DF8D9933C2A08FE0065976
E:\数据挖掘课程PPT\6ASSO.pdf(algorithm:SHA):4D04780EBB487C1AA014C631A5E5CB5305E6EE31
E:\数据挖掘课程PPT\9CMPLX.pdf(algorithm:SHA):B135431328FDC5ABC965C01B0FD126C21533F5EB