java 防篡改_用JAVA写一个简易图片防篡改
图片防止篡改部分
第一步,获取图片的md5字符串,并转为字节数组
//将图片使用md5加密
private static byte[] img2Md5Bytes(File file,String salt) throws Exception{
FileInputStream inputStream=new FileInputStream(file);
StringBuilder builder=new StringBuilder();
byte[] bytes=new byte[1024];
int bytesRead;
while ((bytesRead=inputStream.read(bytes))!=-1){
builder.append(new String(bytes,0,bytesRead));
}
inputStream.close();
builder.append(salt);
String md5=md5(builder.toString());
return hexStringToBytes(md5);
}
//16进制转字节数组
private static byte[] hexStringToBytes(String hexString) {
if (hexString == null || hexString.equals("")) {
return null;
}
hexString = hexString.toUpperCase();
int length = hexString.length() / 2;
char[] hexChars = hexString.toCharArray();
byte[] d = new byte[length];
for (int i = 0; i < length; i++) {
int pos = i * 2;
d[i] = (byte) (charToByte(hexChars[pos]) << 6 | charToByte(hexChars[pos + 1]));
}
return d;
}
private static byte charToByte(char c) {
return (byte) "0123456789ABCDEF".indexOf(c);
}
//md5加密字符串
private static String md5(String str) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(str.getBytes());
return new BigInteger(1, md.digest()).toString(16);
} catch (Exception e) {
return "";
}
}
第二步,图片末尾加md5字节数组
//图片末尾加md5字节数组
private static void imgAppendMd5Bytes(File file,byte[] md5Bytes) throws Exception{
RandomAccessFile accessFile=new RandomAccessFile(file,"rw");
long length=accessFile.length();
accessFile.seek(length);
accessFile.write(md5Bytes);
accessFile.close();
}
第三步,封装一下
//防止图片被篡改
private static void preventTamper(File file,String salt) throws Exception{
byte[] md5bytes=img2Md5Bytes(file,salt);
imgAppendMd5Bytes(file,md5bytes);
}
图片验证部分
第一步,获取图片的末尾存储的md5字节数组
//获取存储在图片末尾的16个md5字节
public static byte[] popMd5Bytes(File file) throws Exception{
RandomAccessFile accessFile=new RandomAccessFile(file,"rw");
byte[] bytes=new byte[16];
long length=accessFile.length();
accessFile.seek(length-16);
for (int i=0;i<16;i++){
bytes[i]=accessFile.readByte();
}
accessFile.close();
return bytes;
}
第二步,去除图片末尾的16个md5字节后,重新计算图片的md5值
//去除图片末尾的16个md5字节
private static void imgDelEndMd5Bytes(File file) throws Exception{
RandomAccessFile accessFile=new RandomAccessFile(file,"rw");
FileChannel fc = accessFile.getChannel();
fc.truncate(accessFile.length()-16);
fc.close();
accessFile.close();
}
byte[] imgMd5=img2Md5Bytes(file,salt);
第三步,封装为方法
//验证图片是否被篡改
private static boolean notTamper(File file,String salt) throws Exception{
byte[] storageMd5=popMd5Bytes(file);//获取存储在图片末尾的16个md5字节
imgDelEndMd5Bytes(file);//删除末尾md5字节数组
byte[] imgMd5=img2Md5Bytes(file,salt);
return Arrays.equals(storageMd5,imgMd5);
}
简单实现,没有进行调优
java 防篡改_用JAVA写一个简易图片防篡改相关推荐
- java 防篡改_用JAVA二十分钟撸一个简易图片防篡改
看到有个毕设是搞图片防篡改的,就自己撸了一个简易图片防止篡改. 原理 将图片字节生成字符串使用摘要算法加密,将加密生成的字节写到图片最后.验证时,首先读取末尾的加密字节,读取完成以后删除,再通过摘要算 ...
- python测试抽奖脚本_使用 Python 写一个简易的抽奖程序
不知道有多少人是被这个头图骗进来的:) 事情的起因是这样的,上周有同学问小编,看着小编的示例代码敲代码,感觉自己也会写了,如果不看的话,七七八八可能也写的出来,但是一旦自己独立写一段程序,感觉到无从下 ...
- java简易计算器考察什么_练习:用java写一个简易计算器
初学java中的选择,判断,循环和方法的概念,写一个简易的两位数计算器 思路推荐: 写4个方法:加减乘除 利用循环+switch进行用户交互 传递需要操作的两个数 输出结果 package com.j ...
- Java IO练习--在程序中写一个“HelloJavaWorld你好世界“输出到操作系统文件Hello.txt文件中
package com.kj.test;import cn.hutool.core.io.IoUtil;import java.io.File; import java.io.FileOutputSt ...
- 用java写一个简易日历
写一个简易日历 记录学习之路,用java语言,用的IDEA编辑器. 我觉得写日历一定要有两个首要方法,所以我首先先写了两个方法,一个是判断是否是闰年,方法代码如下 static boolean jud ...
- python123程序设计题说句心里话_用c++写一个简单的计算器程序
// 050305.cpp : 定义控制台应用程序的入口点. // // 050304.cpp : 定义控制台应用程序的入口点. // //四则运算 #include "stdafx.h&q ...
- 肝一波 ~ 手写一个简易版的Mybatis,带你深入领略它的魅力!
零.准备工作 <dependencies><dependency><groupId>mysql</groupId><artifactId>m ...
- 用eclipse和Tomcat写一个简易聊天室
本文讲述如何用JAVA语言写一个简易的聊天室 简易聊天室的代码实现,因为笔者还是个正在好好学习努力进步的学生,所以代码可能还有很多可以优化的地方,仅供参考. 开发步骤: 第一部分:UI构建 第一步:编 ...
- python写音乐播放器_AJ Kipper:用Python写一个简易的MP3播放器
用Python写一个简易的MP3播放器 前言 最近在学习Web.py框架的时候,了解了基本的Python连接数据库(MySQL)的方法.学完后,总想用它来干点啥,于是,就想能不能写一个MP3播放器.一 ...
最新文章
- 初学者的困惑:OOP与一般编程的区别
- Redis学习手册(实例代码)
- Boost Asio总结(7)class strand
- 神策沙龙回顾:大数据技术和金融、房产、理财的深度结合
- Html.ActionLink
- java 虚拟机_浅谈Java虚拟机内存区
- python读取excel写入mysql pandas_python pandas 读取文件 写入文件excel
- 为什么我们的软件不及印度
- 再来关注一哥们的博客 水木 风雪
- WORD 如何在方框里打勾?
- C++之指针探究(十五):回调函数应用之qsort排序
- [转载] python中实现矩阵乘法
- 窗口设置的一般操作方法
- 科密t1消费管理系统_科密A1\T1登录密码获取软件-科密A1\T1登录密码获取工具1.0.0 安卓版-东坡下载...
- 百度api翻译html,帮助文档首页
- favicon.ico在线制作,在线Favicon.ico制作转换工具
- 创新抗生素获FDA优先审评资格 治疗社区获得性肺炎
- WhatsApp有效号码筛选器WhatsApp频道号WhatsApp群发助手
- 基于安卓的高清语音技术亮相中国国际通信展览会
- 百余款智能电视创意类应用参赛角逐 Top13 App新鲜出炉!
热门文章
- 单页双曲面 matlab,如何画双叶双曲面
- android视频编辑好,安卓比较好用的视频剪辑软件 手机视频剪辑软件推荐
- Linus 批评英特尔的 LAM 代码,拒绝将其合并到内核
- windows执行bat文件闪退情况解决
- 科技交流英语(2022秋)
- 艺赛旗首席科学家、南京大学人工智能学院副院长黎铭教授出席iS-RPM流程挖掘产品发布会演讲分享
- Springboot关于 Circular view path [xxx]: would dispatch back to the current handler URL [xxx] again
- UC浏览器怎样收藏视频?UC浏览器收藏视频的方法
- 接外包有哪些渠道呢?
- 关于js中获取div中的数据