现象
- 签名PDF文件copy获得的副本显示文件未被篡改。
原理
- 数字签名时,需要使用SHA256+base64加工获取原始文件的摘要信息,再通过CA证书进行签名。
目标
- 加工原始文件获取摘要信息。
- 分析文件摘要与文件数据、元数据关联关系。
原始文件
创建6个内容相同的文件。
D:\Dream Future Project\testDIR\a.txt
D:\Dream Future Project\testDIR\adir\a.txt
D:\Dream Future Project\testDIR\b.doc
D:\Dream Future Project\testDIR\c.docx
D:\Dream Future Project\testDIR\d.doc
D:\Dream Future Project\testDIR\e.txt
测试步骤
- 运行程序生成6个文件的摘要。
- 比对文件摘要。
结论
- 文件摘要与文件内容相关。与文件文件名、文件路径、创建时间、修改时间、作者、公司等无关。
- 建议将文件与计算摘要工程进行存算分离,与文件源端摘要+原文,目标端获取原文生成摘要与源端摘要比对逻辑一致。
FileInputStream模式D:\Dream Future Project\testDIR\a.txt
base64: eTj6BKmyr7TARN5ytoiyyB4TIBwFvContJSaGEGYflI=
…
FileInputStream模式D:\Dream Future Project\testDIR\adir\a.txt
base64: eTj6BKmyr7TARN5ytoiyyB4TIBwFvContJSaGEGYflI=
…
FileInputStream模式D:\Dream Future Project\testDIR\e.txt
base64: eTj6BKmyr7TARN5ytoiyyB4TIBwFvContJSaGEGYflI=
…
FileInputStream模式D:\Dream Future Project\testDIR\b.doc
base64: /dn/+t9fk8he+kk5iJMVwp+rx8sdHbZqRIAUcyiFHn0=
…
FileInputStream模式D:\Dream Future Project\testDIR\d.doc
base64: LgLOoiGAqLkFOFUMtgJRN5eW6QBXF4KMjs3bgymM28Y=
…
FileInputStream模式D:\Dream Future Project\testDIR\c.docx
base64: WtF904enhQohykVz2yCygRcYqAT/iZHzDGJR9tZSbW0=
代码
package com.dreamfuture.elearning.test;
import org.apache.shiro.codec.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class TestTmall {
static Logger logger = LoggerFactory.getLogger(TestTmall.class);
public static void main(String args[]) throws NoSuchAlgorithmException, IOException {
String a1fileName = "D:\\Dream Future Project\\testDIR\\a.txt";
String a2fileName = "D:\\Dream Future Project\\testDIR\\adir\\a.txt";
String bfileName = "D:\\Dream Future Project\\testDIR\\b.doc";
String cfileName = "D:\\Dream Future Project\\testDIR\\c.docx";
String dfileName = "D:\\Dream Future Project\\testDIR\\d.doc";
String efileName = "D:\\Dream Future Project\\testDIR\\e.txt";
/**
* 签名与文件内容相关
* 与文件路径、文件名、创建时间、修改时间等无关
* 建立文件路径、文件名与文件url关联关系,远程获取文件到本地生成摘要
* */
encodingWithFileInputStream(a1fileName);
encodingWithFileInputStream(a2fileName);
encodingWithFileInputStream(efileName);
encodingWithFileInputStream(bfileName);
encodingWithFileInputStream(dfileName);
encodingWithFileInputStream(cfileName);
}
private static void encodingWithFileInputStream(String fileName) throws NoSuchAlgorithmException, IOException {
File file = new File(fileName);
InputStream in = new FileInputStream(file);
String algorithmName = "SHA-256";
MessageDigest messageDigest = MessageDigest.getInstance(algorithmName);
byte buffer[] = new byte[1024];
int len;
while ((len = in.read(buffer, 0, 1024)) != -1) {
messageDigest.update(buffer, 0, len);
}
logger.error("\nFileInputStream模式" + fileName +
//"\nSHA256算法: " + messageDigest.digest() +
"\nbase64: " + Base64.encodeToString(messageDigest.digest()) + "\n");
in.close();
}
}