- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Java防止文件被篡改之文件校验功能的实例代码由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
1.为什么要防止文件被篡改?
答案是显然的,为了保证版权,系统安全性等。之前公司开发一个系统,技术核心是一个科学院院士的研究成果,作为一款商业软件来说,保证公司及作者版权是非常重要的。系统安全性就更不用说了,系统两三下就被搞垮了,那这个系统就不算是一个合格的系统.
2.文件校验和作用 。
我们都知道,一个系统或者软件都是由众多文件组成的。文件校验和的作用就是保证系统版本的正确性和唯一性。具体原理下面会详细解释.
3.文件校验和的原理 。
思路和实现的方式可能多种多样,我说的是自己的思路和实现方式,请读者自己斟酌使用.
原理:主要有两个核心:
1.每个不同的文件的md5值是不同的 。
2.每个文件被修改后的md5会发生改变 。
4.实现思路 。
1. 拿到系统的根目录 。
2. 采用递归,遍历目录文件 。
3. 计算每个文件的md5值 , 并相加。 原因:每个文件md5值不同,相加后的md5值也必定是唯一。 一个md5值占32位,4个字节。大家都知道,1gb = 1024mb ; 1mb = 1024kb; 1kb=1024b ; 1b = 8bit ; 也就是说就算系统有10000个文件,10000*4b/1024 = 39kb 。这个值是远远小于string的最大值的。string 最大值位2gb左右,本人未亲自测试过,数据从网上得来.
4.所有文件的md5值相加后,得到一个总的md5值,并且是唯一的.
5.用户客户端启动时,会先校验文件和,若和服务器中的校验和不一致,则判定客户端非法,禁止其一切行为! 。
注意:有些文件是一值在改变的,如log日志。故这些一直在变的文件,不应该参与文件校验和计算 。
5.代码实现 。
校验文件 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
public
class
checksystemfoldersum {
// 所有文件md5总和
private
static
string filesum =
""
;
/**
* 遍历文件夹下的所有文件(递归) 并对每个文件计算md5值 得到所有文件的md5值之和
* @param file 软件系统的根文件夹 , suffix 目录文件后缀(以该后缀结尾的目录不会遍历和计算md5值)
* @return 系统所有文件md5之和
*/
public
string traversefolder(file file , string suffix){
if
(file ==
null
){
throw
new
nullpointerexception(
"遍历路径为空路径或非法路径"
);
}
if
(file.exists()) {
//判断文件或目录是否存在
file[] files = file.listfiles();
if
(files.length ==
0
) {
// 文件夹为空
return
null
;
}
else
{
for
(file f : files) {
// 遍历文件夹
if
(f.isdirectory()) {
// 判断是否是目录
if
(!(f.getname().endswith(
".no"
))){
// 如果不是以.no结尾的目录 则计算该目录下的文件的md5值
// 递归遍历
traversefolder(f,suffix);
}
}
else
{
// 得到文件的md5值
string string = checkmd5(f);
// 将每个文件的md5值相加
filesum+=string;
}
}
}
}
else
{
return
null
;
// 目录不存在
}
return
filesum;
// 返回所有文件md5值字符串之和
}
计算文件md5值
/**
* 检验文件生成唯一的md5值 作用:检验文件是否已被修改
* @param file 需要检验的文件
* @return 该文件的md5值
*/
private
static
string checkmd5(file file) {
// 若输入的参数不是一个文件 则抛出异常
if
(!file.isfile()){
throw
new
numberformatexception(
"参数错误!请输入校准文件。"
);
}
// 定义相关变量
fileinputstream fis =
null
;
byte
[] rb =
null
;
digestinputstream digestinputstream =
null
;
try
{
fis =
new
fileinputstream(file);
messagedigest md5 = messagedigest.getinstance(
"md5"
);
digestinputstream =
new
digestinputstream(fis,md5);
byte
[] buffer =
new
byte
[
4096
];
while
(digestinputstream.read(buffer) >
0
);
md5 = digestinputstream.getmessagedigest();
rb = md5.digest();
}
catch
(filenotfoundexception e) {
e.printstacktrace();
}
catch
(ioexception e) {
e.printstacktrace();
}
catch
(nosuchalgorithmexception e) {
e.printstacktrace();
}
finally
{
try
{
fis.close();
}
catch
(ioexception e) {
e.printstacktrace();
}
}
stringbuilder sb =
new
stringbuilder();
for
(
int
i =
0
; i < rb.length; i++) {
string a = integer.tohexstring(
0xff
& rb[i]);
if
(a.length() <
2
) {
a =
'0'
+ a;
}
sb.append(a);
}
return
sb.tostring();
//得到md5值
}
|
测试 。
测试结果没有问题.
源码下载: 请注意,源码文件的包名涉及隐私已被去除,还有代码中的地址等需修改。请大家调试完成后再进行测试! 。
下载地址:src-java.rar 。
此代码只是一个原理的demo,实际应用需要根据实际情况做相应的调整! 。
总结 。
以上所述是小编给大家介绍的java防止文件被篡改之文件校验功能的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我网站的支持! 。
原文链接:https://www.cnblogs.com/amazingjava/archive/2018/11/14/9956351.html 。
最后此篇关于Java防止文件被篡改之文件校验功能的实例代码的文章就讲到这里了,如果你想了解更多关于Java防止文件被篡改之文件校验功能的实例代码的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我尝试理解[c代码 -> 汇编]代码 void node::Check( data & _data1, vector& _data2) { -> push ebp -> mov ebp,esp ->
我需要在当前表单(代码)的上下文中运行文本文件中的代码。其中一项要求是让代码创建新控件并将其添加到当前窗体。 例如,在Form1.cs中: using System.Windows.Forms; ..
我有此 C++ 代码并将其转换为 C# (.net Framework 4) 代码。有没有人给我一些关于 malloc、free 和 sprintf 方法的提示? int monate = ee; d
我的网络服务器代码有问题 #include #include #include #include #include #include #include int
给定以下 html 代码,将列表中的第三个元素(即“美丽”一词)以斜体显示的 CSS 代码是什么?当然,我可以给这个元素一个 id 或一个 class,但 html 代码必须保持不变。谢谢
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
我试图制作一个宏来避免重复代码和注释。 我试过这个: #define GrowOnPage(any Page, any Component) Component.Width := Page.Surfa
我正在尝试将我的旧 C++ 代码“翻译”成头条新闻所暗示的 C# 代码。问题是我是 C# 中的新手,并不是所有的东西都像 C++ 中那样。在 C++ 中这些解决方案运行良好,但在 C# 中只是不能。我
在 Windows 10 上工作,R 语言的格式化程序似乎没有在 Visual Studio Code 中完成它的工作。我试过R support for Visual Studio Code和 R-T
我正在处理一些报告(计数),我必须获取不同参数的计数。非常简单但乏味。 一个参数的示例查询: qCountsEmployee = ( "select count(*) from %s wher
最近几天我尝试从 d00m 调试网络错误。我开始用尽想法/线索,我希望其他 SO 用户拥有可能有用的宝贵经验。我希望能够提供所有相关信息,但我个人无法控制服务器环境。 整个事情始于用户注意到我们应用程
我有一个 app.js 文件,其中包含如下 dojo amd 模式代码: require(["dojo/dom", ..], function(dom){ dom.byId('someId').i
我对“-gencode”语句中的“code=sm_X”选项有点困惑。 一个例子:NVCC 编译器选项有什么作用 -gencode arch=compute_13,code=sm_13 嵌入库中? 只有
我为我的表格使用 X-editable 框架。 但是我有一些问题。 $(document).ready(function() { $('.access').editable({
我一直在通过本教程学习 flask/python http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-wo
我想将 Vim 和 EMACS 用于 CNC、G 代码和 M 代码。 Vim 或 EMACS 是否有任何语法或模式来处理这种类型的代码? 最佳答案 一些快速搜索使我找到了 this vim 和 thi
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve this
这个问题在这里已经有了答案: Enabling markdown highlighting in Vim (5 个回答) 6年前关闭。 当我在 Vim 中编辑包含 Markdown 代码的 READM
我正在 Swift3 iOS 中开发视频应用程序。基本上我必须将视频 Assets 和音频与淡入淡出效果合并为一个并将其保存到 iPhone 画廊。为此,我使用以下方法: private func d
pipeline { agent any stages { stage('Build') { steps { e
我是一名优秀的程序员,十分优秀!