图片防止篡改部分

第一步,获取图片的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写一个简易图片防篡改相关推荐

  1. java 防篡改_用JAVA二十分钟撸一个简易图片防篡改

    看到有个毕设是搞图片防篡改的,就自己撸了一个简易图片防止篡改. 原理 将图片字节生成字符串使用摘要算法加密,将加密生成的字节写到图片最后.验证时,首先读取末尾的加密字节,读取完成以后删除,再通过摘要算 ...

  2. python测试抽奖脚本_使用 Python 写一个简易的抽奖程序

    不知道有多少人是被这个头图骗进来的:) 事情的起因是这样的,上周有同学问小编,看着小编的示例代码敲代码,感觉自己也会写了,如果不看的话,七七八八可能也写的出来,但是一旦自己独立写一段程序,感觉到无从下 ...

  3. java简易计算器考察什么_练习:用java写一个简易计算器

    初学java中的选择,判断,循环和方法的概念,写一个简易的两位数计算器 思路推荐: 写4个方法:加减乘除 利用循环+switch进行用户交互 传递需要操作的两个数 输出结果 package com.j ...

  4. Java IO练习--在程序中写一个“HelloJavaWorld你好世界“输出到操作系统文件Hello.txt文件中

    package com.kj.test;import cn.hutool.core.io.IoUtil;import java.io.File; import java.io.FileOutputSt ...

  5. 用java写一个简易日历

    写一个简易日历 记录学习之路,用java语言,用的IDEA编辑器. 我觉得写日历一定要有两个首要方法,所以我首先先写了两个方法,一个是判断是否是闰年,方法代码如下 static boolean jud ...

  6. python123程序设计题说句心里话_用c++写一个简单的计算器程序

    // 050305.cpp : 定义控制台应用程序的入口点. // // 050304.cpp : 定义控制台应用程序的入口点. // //四则运算 #include "stdafx.h&q ...

  7. 肝一波 ~ 手写一个简易版的Mybatis,带你深入领略它的魅力!

    零.准备工作 <dependencies><dependency><groupId>mysql</groupId><artifactId>m ...

  8. 用eclipse和Tomcat写一个简易聊天室

    本文讲述如何用JAVA语言写一个简易的聊天室 简易聊天室的代码实现,因为笔者还是个正在好好学习努力进步的学生,所以代码可能还有很多可以优化的地方,仅供参考. 开发步骤: 第一部分:UI构建 第一步:编 ...

  9. python写音乐播放器_AJ Kipper:用Python写一个简易的MP3播放器

    用Python写一个简易的MP3播放器 前言 最近在学习Web.py框架的时候,了解了基本的Python连接数据库(MySQL)的方法.学完后,总想用它来干点啥,于是,就想能不能写一个MP3播放器.一 ...

最新文章

  1. 初学者的困惑:OOP与一般编程的区别
  2. Redis学习手册(实例代码)
  3. Boost Asio总结(7)class strand
  4. 神策沙龙回顾:大数据技术和金融、房产、理财的深度结合
  5. Html.ActionLink
  6. java 虚拟机_浅谈Java虚拟机内存区
  7. python读取excel写入mysql pandas_python pandas 读取文件 写入文件excel
  8. 为什么我们的软件不及印度
  9. 再来关注一哥们的博客 水木 风雪
  10. WORD 如何在方框里打勾?
  11. C++之指针探究(十五):回调函数应用之qsort排序
  12. [转载] python中实现矩阵乘法
  13. 窗口设置的一般操作方法
  14. 科密t1消费管理系统_科密A1\T1登录密码获取软件-科密A1\T1登录密码获取工具1.0.0 安卓版-东坡下载...
  15. 百度api翻译html,帮助文档首页
  16. favicon.ico在线制作,在线Favicon.ico制作转换工具
  17. 创新抗生素获FDA优先审评资格 治疗社区获得性肺炎
  18. WhatsApp有效号码筛选器WhatsApp频道号WhatsApp群发助手
  19. 基于安卓的高清语音技术亮相中国国际通信展览会
  20. 百余款智能电视创意类应用参赛角逐 Top13 App新鲜出炉!

热门文章

  1. 单页双曲面 matlab,如何画双叶双曲面
  2. android视频编辑好,安卓比较好用的视频剪辑软件 手机视频剪辑软件推荐
  3. Linus 批评英特尔的 LAM 代码,拒绝将其合并到内核
  4. windows执行bat文件闪退情况解决
  5. 科技交流英语(2022秋)
  6. 艺赛旗首席科学家、南京大学人工智能学院副院长黎铭教授出席iS-RPM流程挖掘产品发布会演讲分享
  7. Springboot关于 Circular view path [xxx]: would dispatch back to the current handler URL [xxx] again
  8. UC浏览器怎样收藏视频?UC浏览器收藏视频的方法
  9. 接外包有哪些渠道呢?
  10. 关于js中获取div中的数据