目录

背景

存储方案对比

逻辑思路

在原有系统中开发

在原有系统外运行客户端代码

MD5文件校验

文件是否改变


背景

客户需要对服务器上存量的文件有一个直观的了解,通过图形界面手动操作文件的定时定量备份

存储方案对比

网上一些现有的存储方案对比

备份一体机 传统
备份原理 在设计部文件服务器上安装备份代理,定期通过网络备份到一体机 通过DFS复制,实时或定期将文件副本写入新服务器,定期对新服务器存储的文件备份到本地
安全性 因为其使用linux做为底层,不易受到勒索病毒***,文件不易被删除,安全性较高 使用windows,在windows上使用备份工具备份,易受到勒索病毒***,存在安全风险
可靠性 使用单独的一体机,只用于备份设计部文件服务器时,可靠性较高 使用wsb,文件易被误删除,导致无法还原,可靠性比一体机低
如果DFS出错,未能同步,可能导致数据丢失
底层OS为windows,备份做为一种工具或程序存在,OS故障,则导致备份可能无法还原
备份时间 按备份速度为50MB/s,即网络流量为400Mbps,单次全备时间预计60个小时以上 除首次同步外,不需长时间占用网络流量,在同一台机器上备份
价格 160000 55000
优势 可靠性高,操作简单,易于验证,不易出错 价格较低,只购买一台服务器,且服务器可以用于提供文件服务(备用文件服务器)
劣势 价格较高 可靠性和安全性比备份一体机低,无售后技术支持

逻辑思路

根据现实情况,考虑到经费问题,采用传统方案

在原有系统中开发

  • 系统原本文件地址信息可能分布于不同的模块内容(表)中,//也有可能集中存储
  • 单独一张表,用于存储文件相关信息,其中包含上传时间、是否已备份
  • 文件服务器上部署相关代码,提供接口,负责文件的增删改查功能
  • 业务系统增加参数设置,控制文件是否实时同步、定时任务(对备份时间、数量、文件类型等情况进行管理)
  • 定时任务执行文件信息表中最近上传且未备份的记录
  • 异常情况预警处理,如:备份失败自动跳过并汇总失败信息、磁盘空间不足预警提示
  • 操作层面删除的文件在服务器系统内是否保存根据实际情况决定

在原有系统外运行客户端代码

待续

MD5文件校验

MD5校验(checksum)是通过对接收的传输数据执行散列运算来检查数据的正确性。

一个散列函数,比如 MD5,是一个将任意长度的数据字符串转化成短的固定长度的值的单向操作。任意两个字符串不应有相同的散列值(即,有“很大可能”是不一样的,并且要人为地创造出来两个散列值相同的字符串应该是困难的)。

一个 MD5 校验和(checksum)通过对接收的传输数据执行散列运算来检查数据的正确性。计算出的散列值拿来和随数据传输的散列值比较。如果两个值相同,说明传输的数据完整无误、没有被窜改过(前提是散列值没有被窜改),从而可以放心使用。

MD5校验可以应用多个领域,比如说机密资料的检验,下载文件的检验,明文密码的加密等。

如客户往我们数据中心同步一个文件,该文件使用MD5校验,那么客户在发送文件的同时会再发一个存有校验码的文件,我们拿到该文件后做MD5运算,得到的计算结果与客户发送的校验码相比较,如果一致则认为客户发送的文件没有出错,否则认为文件出错需要重新发送。

在使用网盘存储文件时,会对本地文件进行MD5校验,服务端数据会对存储的文件MD5校验值做存储,拿本地MD5值在数据库中做匹配,如果存在,直接在服务器内赋值,就能实现快速上传。

文件是否改变

用比较文件hash值的方法来对比文件是否变更,文件hash又叫文件签名,文件中哪怕一个bit位被改变了,文件hash就会不同。

比较常用的文件hash算法有MD5和SHA-1,这里使用MD5。

package com.test;  import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.math.BigInteger;
import java.security.MessageDigest;  public class MD5Util {  public static void main(String[] args) {  try {  //此处我测试的是我本机jdk源码文件的MD5值 String filePath = "C:\\Program Files\\Java\\jdk1.7.0_45\\src.zip";String md5Hashcode = md5HashCode(filePath);String md5Hashcode32 = md5HashCode32(filePath);  System.out.println(md5Hashcode + ":文件的md5值");  System.out.println(md5Hashcode32+":文件32位的md5值"); //System.out.println(-100 & 0xff);} catch (FileNotFoundException e) {  e.printStackTrace();  }  }  /*** 获取文件的md5值 ,有可能不是32位* @param filePath  文件路径* @return* @throws FileNotFoundException*/public static String md5HashCode(String filePath) throws FileNotFoundException{  FileInputStream fis = new FileInputStream(filePath);  return md5HashCode(fis);  }  /*** 保证文件的MD5值为32位* @param filePath   文件路径* @return* @throws FileNotFoundException*/public static String md5HashCode32(String filePath) throws FileNotFoundException{  FileInputStream fis = new FileInputStream(filePath);  return md5HashCode32(fis);  }  /*** java获取文件的md5值  * @param fis 输入流* @return*/public static String md5HashCode(InputStream fis) {  try {  //拿到一个MD5转换器,如果想使用SHA-1或SHA-256,则传入SHA-1,SHA-256  MessageDigest md = MessageDigest.getInstance("MD5"); //分多次将一个文件读入,对于大型文件而言,比较推荐这种方式,占用内存比较少。byte[] buffer = new byte[1024];  int length = -1;  while ((length = fis.read(buffer, 0, 1024)) != -1) {  md.update(buffer, 0, length);  }  fis.close();//转换并返回包含16个元素字节数组,返回数值范围为-128到127byte[] md5Bytes  = md.digest();BigInteger bigInt = new BigInteger(1, md5Bytes);//1代表绝对值 return bigInt.toString(16);//转换为16进制} catch (Exception e) {  e.printStackTrace();  return "";  }  }  /*** java计算文件32位md5值* @param fis 输入流* @return*/public static String md5HashCode32(InputStream fis) {try {//拿到一个MD5转换器,如果想使用SHA-1或SHA-256,则传入SHA-1,SHA-256  MessageDigest md = MessageDigest.getInstance("MD5");//分多次将一个文件读入,对于大型文件而言,比较推荐这种方式,占用内存比较少。byte[] buffer = new byte[1024];int length = -1;while ((length = fis.read(buffer, 0, 1024)) != -1) {md.update(buffer, 0, length);}fis.close();//转换并返回包含16个元素字节数组,返回数值范围为-128到127byte[] md5Bytes  = md.digest();StringBuffer hexValue = new StringBuffer();for (int i = 0; i < md5Bytes.length; i++) {int val = ((int) md5Bytes[i]) & 0xff;//解释参见最下方if (val < 16) {/*** 如果小于16,那么val值的16进制形式必然为一位,* 因为十进制0,1...9,10,11,12,13,14,15 对应的 16进制为 0,1...9,a,b,c,d,e,f;* 此处高位补0。*/hexValue.append("0");}//这里借助了Integer类的方法实现16进制的转换 hexValue.append(Integer.toHexString(val));}return hexValue.toString();} catch (Exception e) {e.printStackTrace();return "";}}/*** 方法md5HashCode32 中     ((int) md5Bytes[i]) & 0xff   操作的解释:* 在Java语言中涉及到字节byte数组数据的一些操作时,经常看到 byte[i] & 0xff这样的操作,这里就记录总结一下这里包含的意义: * 1、0xff是16进制(十进制是255),它默认为整形,二进制位为32位,最低八位是“1111 1111”,其余24位都是0。 * 2、&运算: 如果2个bit都是1,则得1,否则得0; * 3、byte[i] & 0xff:首先,这个操作一般都是在将byte数据转成int或者其他整形数据的过程中;使用了这个操作,最终的整形数据只有低8位有数据,其他位数都为0。 * 4、这个操作得出的整形数据都是大于等于0并且小于等于255的*/}  

服务器文件备份,MD5文件校验相关推荐

  1. 安全编程之MD5文件校验

    MD5文件校验的作用: 每个文件都可以用MD5验证程序算出一个固定的MD5值,是独一无二的.一般来说,开发方会在软件发布时预先算出文件的MD5值,如果文件被盗用,加了木马或者被篡改版权,那么它的MD5 ...

  2. 初级版python登录验证,上传下载文件加MD5文件校验

    服务器端程序 import socket import json import struct import hashlib import osdef md5_code(usr, pwd):ret = ...

  3. python文件拷贝并校验_初级版python登录验证,上传下载文件加MD5文件校验

    importosimportjsonimportsocketimportstructimporthashlib#import time deflogin(): usr= input('请输入用户名:' ...

  4. JAVA实现MD5文件校验

    MD5 的中文名叫做 "信息摘要算法第五版",是一种不可逆的算法.通俗的话说就是没办法通过任何算法来对其加密的值进行破解.MD5经常被应用在验证文件一致性.数字证书和安全访问认证方 ...

  5. java md5 文件验证_Java MD5 文件校验处理

    有两种方式,一种比较优雅,大气,不过对于大文件需要进度条显示的情况不太合适, public String getFileMD5String(File file) throws Exception { ...

  6. ubuntu md5文件校验

    md5sum 文件名 md5sum OK8MQ-linux-sdk.tar.bz2

  7. STM32计算文件MD5值校验数据

    首先介绍一下什么是MD5: 一.MD5计算将整个文件或者字符串,通过其不可逆的字符串变换计算,产生文件或字符串的MD5散列值.任意两个文件.字符串不会有相同的散列值(即"很大可能" ...

  8. java md5 文件验证_Java 自带MD5 校验文件

    转载声明:http://blog.csdn.net/zishan007/article/details/7971229 package com.chinasoft.corpinfosys.common ...

  9. PHP 文件校验 文件的 MD5 散列值

    PHP   MD5 散列值 应用场景: 1.校验文件的完整性       可用于服务器文件的备份处理. 2.检验文件的重复性      去除服务器上传文件的重复,占用额外空间的问题. 3.校验文件是否 ...

最新文章

  1. 全网最详细 TCP 参数讲解,不用担心没有面试机会
  2. 阿里云服务器常见用语
  3. 青少年计算机学奥林匹克大赛,2019年第36届全国青少年信息学奥林匹克竞赛获奖规则...
  4. linux路由表命令
  5. SGID,SUID,SBIT
  6. 硬核机械手!失去手指的机械工程师独立打造
  7. 前端学习(1401):多人管理21新增用户
  8. 励志!26岁单臂博士生:我想在科研的道路上发更多高质量论文
  9. DataGrid 功能实现收集(转)保留做参考
  10. plc tcp ip通讯怎么只能连一个客户端_如何远程读取西门子PLC数据?
  11. 设计模式--创建型模式之抽象工厂模式
  12. nginx location正则匹配规则
  13. 带中文说明书OSLO Light 6.2-ISO 1CD光学软件
  14. N phpspider爬虫获取网站内容demo
  15. finecms aip.php漏洞,代码审计| FineCMS的GetShell姿势
  16. cout与printf区别
  17. hdu 2481 树状数组 双关键字排阻
  18. 工业动画制作过程介绍(一)——静态简笔图画的制作
  19. Linux驱动编写入门-新解
  20. 直角坐标系和极坐标系

热门文章

  1. SandcastleHelpFileBuilder文档生成
  2. Vue 正则表达式验证表单字段(如用户名/密码/真实姓名/身份证/手机号/邮箱)的合法性
  3. ICRA 2023 | 第一届RoboDepth鲁棒深度估计竞赛
  4. ubuntu文件夹侧边栏消失不见
  5. 狡兔三窟,这是第二窟;)
  6. 我的“狡兔三窟”成长计划
  7. Kotlin KTX 扩展库
  8. 广西北海中学2021年高考成绩查询,北海高中成绩排名2021,北海中考分数线排行榜...
  9. 数据分析师的工作原则
  10. css实现京东的价格标签