文档章节

用JAVA写一个简易图片防篡改

物种起源-达尔文
 物种起源-达尔文
发布于 2017/02/20 11:23
字数 489
阅读 1768
收藏 57

图片防止篡改部分

第一步,获取图片的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);
    }

简单实现,没有进行调优

© 著作权归作者所有

共有 人打赏支持
物种起源-达尔文

物种起源-达尔文

粉丝 4
博文 30
码字总数 27544
作品 0
深圳
程序员
私信 提问
加载中

评论(4)

题目里的小明
题目里的小明
什么业务场景需要这个东西。。
飞天的小熊
楼主你好,我编写了这个异步例子:
class index(tornado.web.RequestHandler):
@tornado.gen.coroutine
def asyncecho(self):
time.sleep(5)

logger.info("async")
raise gen.Return((200,{}))
@tornado.gen.coroutine
def get(self):
(status, ret) = yield self.asyncecho()
self.finish("async")
if __name__ == '__main__':
gc.set_threshold(100, 5, 2)
gc.enable()
logging_init('broker_server','.')
app = tornado.web.Application([(r"/",index)], compress_response = True)
app.listen(33333)
try:
tornado.ioloop.IOLoop.instance().start()
except KeyboardInterrupt:
print "receive KeyboardInterrupt signal..."

用curl 127.0.0.1:33333, 为什么还是串行执行啊?不是同时执行啊
请楼主给予解析,谢谢
物种起源-达尔文
物种起源-达尔文

引用来自“公孙二狗”的评论

如果别人知道你的做法和算法呢?为了保证不被删改,还需要对 MD5 做 RSA 签名,秘钥在你手里。
是,其实还有很多调优的地方,这里并没有写,看实际开发中的扩展呗
公孙二狗
公孙二狗
如果别人知道你的做法和算法呢?为了保证不被删改,还需要对 MD5 做 RSA 签名,秘钥在你手里。
SpringBoot 整合 oauth2(五)实现 jwt 及 扩展

什么是jwt,即 json web token。JWT是一种用于双方之间传递安全信息的简洁的、URL安全的表述性声明规范。也是一种token,但是和token有一些不同。 jwt优点: 自包含 防篡改 可自定义扩展 JW...

FantJ
05/22
0
0
Excelsior JET 7.6 发布,Java虚拟机增强工具

Excelsior JET是一款有提前编译技术的Java虚拟机增强工具(非开源)。提前编译器可以将您的类文件和jars文件转化成高度优化的二进制可执行文件,能够在 Intel x86平台的Microsoft Windows和 ...

红薯
2011/09/20
801
2
Excelsior JET 9.0 MP2 发布,Java 虚拟机增强工具

Excelsior JET 9.0 MP2 发布,此版本修复了一些重要的 bug,添加了对 Java SE 7u55 的支持;支持 64 位 Linux 的 Excelsior 安装程序。 Excelsior JET是一款有提前编译技术的Java虚拟机增强工...

oschina
2014/05/21
1K
7
Excelsior JET 7.6 MP5 发布

Excelsior JET 7.6 MP5 增加对 Java SE 6 Update 37 的支持。 Excelsior JET是一款有提前编译技术的Java虚拟机增强工具。提前编译器可以将您的类文件和jars文件转化成高度优化的二进制可执行...

oschina
2013/01/31
447
1
JVM增强工具 Excelsior JET 7.0 发布

Excelsior JET是一款有提前编译技术的Java虚拟机增强工具(非开源)。提前编译器可以将您的类文件和jars文件转化成高度优化的二进制可执行文件,能够在 Intel x86平台的Microsoft Windows和 ...

红薯
2009/12/17
518
2

没有更多内容

加载失败,请刷新页面

加载更多

This APT has Super Cow Powers.

在Debian/Ubuntu上,apt包管理器内嵌着一个彩蛋. 如果你在命令行界面输入 apt help 在最后一行能找到This APT has Super Cow Powers. 说明该apt具有超级牛力 牛力是个什么梗? 则说明你的系统...

taadis
13分钟前
0
0
起薪2万的爬虫工程师,Python需要学到什么程度才可以就业?

爬虫工程师的的薪资为20K起,当然,因为大数据,薪资也将一路上扬。那么,Python需要学到什么程度呢?今天我们来看看3位前辈的回答。 1、前段时间快要毕业,而我又不想找自己的老本行Java开发...

糖宝lsh
21分钟前
1
0
携手开发者共建云生态 首届腾讯云+社区开发者大会在京举办

本文由云+社区发表 北京时间12月15日,由腾讯云主办,极客邦科技、微信、腾讯TEG协办的首届腾讯云+社区开发者大会在北京朝阳悠唐皇冠假日酒店举办。在会上,腾讯云发布了重磅产品开发者平台以...

腾讯云加社区
42分钟前
1
0
人工智能时代员工如何证明其IT工作价值

机器人可以取代你的工作吗?你能帮助机器人完成它的工作吗?如果你正在考虑自己的职业生涯以及今后将如何发展,那么应该询问自己这些问题了。 机器人可以取代你的工作吗?你能帮助机器人完成它的...

Linux就该这么学
43分钟前
2
0
CPU性能过剩提升乏力影响未来行业发展吗?

虽然CPU仍然在不断发展,但是它的性能已经不再仅仅受限于单个处理器类型或制造工艺上了。和过去相比,CPU性能提升的步伐明显放缓了,接下来怎么办,成为横亘在整个行业面前的大问题。 自201...

linuxCool
54分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部