数字签名:文件摘要与文件内容相关,与文件名等无关

现象

  • 签名PDF文件copy获得的副本显示文件未被篡改。
    在这里插入图片描述

原理

  • 数字签名时,需要使用SHA256+base64加工获取原始文件的摘要信息,再通过CA证书进行签名。

目标

  1. 加工原始文件获取摘要信息。
  2. 分析文件摘要与文件数据、元数据关联关系。

原始文件

创建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();

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值