JAVA中进行数据完整性验证
最近在看JAVA安全方面的东东。简单地说,安全包括访问控制、数据安全两部分。安全访问控制是根据系统需求进行设计的,对资源进行访问控制的一种措施。而数据安全包括数据传输过程中的安全防范措施,包括数据完整性、传输安全性,接收/发送方不可否认性等方面。下面就数据完整性验证部分做简单的介绍。
下载过程中,没有被其他程序算改过?其他程序可能是网络传输过程中的第三方盗窃者,也有可能是本地环境中存在的不良程序,如木马。在apache的下载列表旁边,我们会发现有个md5的链接,点击打开之后,会出现如下字符串:cbad484f0b02f0daf775137aeeOf4e2e"apache tomcat-7.0.21zip。这是做什么用的呢?
这是一十六进制的编码字符串,又称“数字指纹”。他其实就是对原版文件(发送方发送的文件)完整性的验证标识符。当我们把文件下到本地后,可以自己对其进行验证,若验证的结果与发送方提供的指纹一致的话,则表明,在传输过程中。数据文件没有被算改或其他损耗。
1.需要的maven依赖(支持jdk1.8及以上)
org.bouncycastle bcprov-jdk18on1.71
2.示例代码
package com.ftsoft.controller;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.math.BigInteger;
import java.security.DigestInputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.Provider;
import java.security.Security;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Hex;
public class CompleteCcheck {
public static void testInputStream(String filePath){
Security.addProvider(new BouncyCastleProvider());
Provider provider = Security.getProvider("BC");
try {
MessageDigest digest = MessageDigest.getInstance("MD5",provider);
FileInputStream in=new FileInputStream(filePath);
DigestInputStream din =new DigestInputStream(in,digest);
int bfSize=40000000;
int length=in.available();
int currentSize=0;
boolean goon=true;
while(goon){
byte[] buffer =new byte[bfSize];
int readSize=bfSize;
if((length-currentSize)


