每期一个小窍门:简单文件摘要工具类(代码片段)

李昊轩的博客 李昊轩的博客     2022-11-30     310

关键词:

有时候我们程序内部要进行文件传输, 为了安全考虑, 需要摘要校验.

比如想传递文件A, 获取了文件A的摘要a, 对方在读取此文件时, 用同样的摘要算法算出a的话就证明文件A没有被篡改, 反之就是被篡改了(摘要码不匹配)

下方是工具类的使用


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;


/**
 * 文件摘要类
 */
public class MD5Builder 

    private static final Logger logger = LoggerFactory.getLogger(MD5Builder.class);
    // 用来将字节转换成 16 进制表示的字符
    static char hexDigits[] = '0', '1', '2', '3', '4', '5', '6', '7', '8',
            '9', 'a', 'b', 'c', 'd', 'e', 'f';

    /**
     * 对文件全文生成MD5摘要
     *
     * @param file 要加密的文件
     * @return MD5摘要码
     */
    public static String getMD5(File file) 
        FileInputStream fis = null;
        try 
            MessageDigest md = MessageDigest.getInstance("MD5");

            logger.info("MD5摘要长度:" + md.getDigestLength());
            fis = new FileInputStream(file);
            byte[] buffer = new byte[2048];
            int length = -1;
            logger.info("开始生成摘要");
            long s = System.currentTimeMillis();
            while ((length = fis.read(buffer)) != -1) 
                md.update(buffer, 0, length);
            
            logger.info("摘要生成成功,总用时: "
                    + (System.currentTimeMillis() - s) + "ms");
            byte[] b = md.digest();
            return byteToHexString(b);
            // 16位加密
            // return buf.toString().substring(8, 24);
         catch (Exception ex) 
            logger.error(Arrays.toString(ex.getStackTrace()));
            ex.printStackTrace();
            return null;
         finally 
            try 
                fis.close();
             catch (IOException ex) 
                ex.printStackTrace();
            
        
    

    /**
     * 对一段String生成MD5加密信息
     *
     * @param message 要加密的String
     * @return 生成的MD5信息
     */
    public static String getMD5(String message) 
        try 
            MessageDigest md = MessageDigest.getInstance("MD5");
            logger.info("MD5摘要长度:" + md.getDigestLength());
            byte[] b = md.digest(message.getBytes());
            return byteToHexString(b);
         catch (NoSuchAlgorithmException e) 
            logger.error(Arrays.toString(e.getStackTrace()));
            e.printStackTrace();
            return null;
        
    

    /**
     * 把byte[]数组转换成十六进制字符串表示形式
     *
     * @param tmp 要转换的byte[]
     * @return 十六进制字符串表示形式
     */
    private static String byteToHexString(byte[] tmp) 
        String s;
        // 用字节表示就是 16 个字节
        char str[] = new char[16 * 2]; // 每个字节用 16 进制表示的话,使用两个字符,
        // 所以表示成 16 进制需要 32 个字符
        int k = 0; // 表示转换结果中对应的字符位置
        for (int i = 0; i < 16; i++)  // 从第一个字节开始,对 MD5 的每一个字节
            // 转换成 16 进制字符的转换
            byte byte0 = tmp[i]; // 取第 i 个字节
            str[k++] = hexDigits[byte0 >>> 4 & 0xf]; // 取字节中高 4 位的数字转换,
            // >>> 为逻辑右移,将符号位一起右移
            str[k++] = hexDigits[byte0 & 0xf]; // 取字节中低 4 位的数字转换
        
        s = new String(str); // 换后的结果转换为字符串
        return s;
    

每期一个小窍门(001):一个简单优雅的redis工具类(最简单版本)(代码片段)

最近决定新开一个每期小窍门专栏,向志同道合的朋友们互相分享一些小窍门,小经验,这一期,给大家一个非常简单好用的redis工具类,非常轻量,砍掉了很多不必要的功能,如果需要比如过期的相关功能,私信或下方评论发送.需要如下m... 查看详情

每期一个小窍门(001):一个简单优雅的redis工具类(最简单版本)(代码片段)

最近决定新开一个每期小窍门专栏,向志同道合的朋友们互相分享一些小窍门,小经验,这一期,给大家一个非常简单好用的redis工具类,非常轻量,砍掉了很多不必要的功能,如果需要比如过期的相关功能,私信或下方评论发送.需要如下m... 查看详情

每期一个小窍门:filebeat简单日志文件抓取到es(代码片段)

一般不用k8s环境的情况下,filebeat可以解决大部分的日志问题下载filebeat:6.2.4,其实这个不像elk一样需要严格的三版本一致,差不多就行curl-L-Ohttps://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.2.4-linux-x86_64.tar.gz解压,如今的linux发行版... 查看详情

每期一个小窍门:filebeat简单日志文件抓取到es(代码片段)

一般不用k8s环境的情况下,filebeat可以解决大部分的日志问题下载filebeat:6.2.4,其实这个不像elk一样需要严格的三版本一致,差不多就行curl-L-Ohttps://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.2.4-linux-x86_64.tar.gz解压,如今的linux发行版... 查看详情

每期一个小窍门:利用supervisor保证进程级别的简单高可用(代码片段)

supervisor安装supervisor是一个简单好用的进程级别的监控组件,可以帮助我们保证进程的高可用.下面是supervisor的安装与使用方法.安装supervisoryuminstall-ysupervisor开机自启systemctlenablesupervisord;systemctlstartsupervisordvi/etc/supervisord.conf此段落... 查看详情

每期一个小窍门(003):mycat实现单库按月分表(可以跨年)(代码片段)

在这一期的小窍门里,分享一个简单好用的分库小中间件,mycatrules.xml(请增量式的修改,不建议随意删除自带算法)这里声明了算法的监控字段,注意这个sBeginDate,要和后面配置文件的相对应,不能早于或者晚于<?xmlversion="1.0"e... 查看详情

每期一个小窍门:利用supervisor保证进程级别的简单高可用(代码片段)

supervisor安装supervisor是一个简单好用的进程级别的监控组件,可以帮助我们保证进程的高可用.下面是supervisor的安装与使用方法.安装supervisoryuminstall-ysupervisor开机自启systemctlenablesupervisord;systemctlstartsupervisordvi/etc/supervisord.conf此段落... 查看详情

每期一个小窍门:压测工具apacheab安装与使用(代码片段)

使用yum安装Apacheabyum-yinstallhttpd-tools因为默认的Apacheab是不支持http1.1及以上的版本,我们的线上环境使用的是http1.1标准.所以,需要敲入下方命令,使之支持http1.1perl-pi-e's/HTTP\\/1.0/HTTP\\/1.1/g'/usr/bin/ab压测之前需要编写压测数据,Apa... 查看详情

每期一个小窍门:压测工具apacheab安装与使用(代码片段)

使用yum安装Apacheabyum-yinstallhttpd-tools因为默认的Apacheab是不支持http1.1及以上的版本,我们的线上环境使用的是http1.1标准.所以,需要敲入下方命令,使之支持http1.1perl-pi-e's/HTTP\\/1.0/HTTP\\/1.1/g'/usr/bin/ab压测之前需要编写压测数据,Apa... 查看详情

每期一个小窍门(003):mycat实现单库按月分表(可以跨年)(代码片段)

在这一期的小窍门里,分享一个简单好用的分库小中间件,mycatrules.xml(请增量式的修改,不建议随意删除自带算法)这里声明了算法的监控字段,注意这个sBeginDate,要和后面配置文件的相对应,不能早于或者晚于<?xmlversion="1.0"e... 查看详情

每期一个小窍门(004)关闭selinux和swap(代码片段)

关闭swap分区【虚拟内存】并且永久关闭虚拟内存。swapoff-a&&sed-i'/swap/s/^\\(.*\\)$/#\\1/g'/etc/fstab关闭SELinuxsetenforce0&&sed-i's/^SELINUX=.*/SELINUX=disabled/'/etc/selinux/config 查看详情

每期一个小窍门(003)关闭selinux和swap(代码片段)

关闭swap分区【虚拟内存】并且永久关闭虚拟内存。swapoff-a&&sed-i'/swap/s/^\\(.*\\)$/#\\1/g'/etc/fstab关闭SELinuxsetenforce0&&sed-i's/^SELINUX=.*/SELINUX=disabled/'/etc/selinux/config 查看详情

每期一个小窍门:mongodb备份/恢复数据库(代码片段)

很多时候我们需要迁移mongodb的数据,下面是一些比较实用的方案指定数据库的备份/恢复指定数据备份mongodump-hxxx:32017-dmodel_10028-o/home/users/lihaoxuan/test2/backup/指定数据恢复mongorestore-hxxx:30181-dmodel_10015--drop/home/users/lihaoxuan/test2/back 查看详情

每期一个小窍门:灰度重启mongodb复制集(代码片段)

首先看mongodb是否k8s托管,如果非容器化的直接跳过任何容器命令需要进入节点,依次灰度关闭复制集群的mongo不能直接deletepod每次关闭必须要等待上一个关闭的节点上线,并重新选举完成,去每个节点一次关闭分别进入0/1/2节点kubectlex... 查看详情

每期一个小窍门:灰度重启mongodb复制集(代码片段)

首先看mongodb是否k8s托管,如果非容器化的直接跳过任何容器命令需要进入节点,依次灰度关闭复制集群的mongo不能直接deletepod每次关闭必须要等待上一个关闭的节点上线,并重新选举完成,去每个节点一次关闭分别进入0/1/2节点kubectlex... 查看详情

每期一个小窍门:灰度重启mongodb复制集(代码片段)

首先看mongodb是否k8s托管,如果非容器化的直接跳过任何容器命令需要进入节点,依次灰度关闭复制集群的mongo不能直接deletepod每次关闭必须要等待上一个关闭的节点上线,并重新选举完成,去每个节点一次关闭分别进入0/1/2节点kubectlex... 查看详情

每期一个小窍门:jenkins生产环境流水线标准构建方案(代码片段)

下拉菜单选择镜像retag为release具体就是获取build列表retag为release同时tag到gitrelease最终执行kubectlsetimagepipelineagentnodelabel'prod01'environmentdockerServer="tcp://10.0.x.x:2375"dockerRegistry=" 查看详情

每期一个小窍门:jenkins生产环境流水线标准构建方案(代码片段)

下拉菜单选择镜像retag为release具体就是获取build列表retag为release同时tag到gitrelease最终执行kubectlsetimagepipelineagentnodelabel'prod01'environmentdockerServer="tcp://10.0.x.x:2375"dockerRegistry=" 查看详情