一、前言
该计划源于我对网络喷子的不满,网络不是净土,现在很多的网民自认为隔着屏幕可以为所欲为。我针对两件事情做如下工作:第一,很多网友去盗图然后去编故事,导致同样一张图被上传不至很多次,都说图片是知识产权,但是网友不以为然,而且某些平台为了所谓的流量置之不理;第二,某些人在网络中潜水,散步虚假信息和图片,对于这种行为要严厉打击。因此我的想法是,第一利用信息摘要MD5技术,避免图片重复上传,第二利用图片的Exif信息,给图片上传者加上时间戳和个人信息加密以及平台烙印。我们都知道很多平台给图片加上了水印,但是呢影响视觉体验。
二、代码
我用的是Jupyter
# 查看MD5值
import hashlib
from PIL import Image
import piexif
import time
import base64
# 得到图片的MD5信息
def getPictureMD5(filePath):
with open(filePath, 'rb') as f:
md5 = hashlib.md5(f.read()).hexdigest()
return md5
# 我们将png图片转换为jpg文件 为我们提供 素材
im = Image.open("./logo.png")
im = im.convert('RGB')
im.save("./logo.jpg")
# 读取 该jpg文件的 exif 信息
exif_dict = piexif.load('./logo.jpg')
print(exif_dict)# 我们发现Exif信息都是空的 现在我们要填充它们
# {'0th': {}, 'Exif': {}, 'GPS': {}, 'Interop': {}, '1st': {}, 'thumbnail': None}
# 填充信息 未加密
exif_dict["0th"][piexif.ImageIFD.Artist] = "江湖人称王某人的程序员".encode()#修改作者信息
exif_dict["Exif"][piexif.ExifIFD.DateTimeOriginal] = u"2021:06:19 10:10:10".encode()#修改拍摄时间 时间格式不能错
exif_dict["0th"][piexif.ImageIFD.Software] = "优快云".encode()#修改版权
exif_bytes = piexif.dump(exif_dict)# 转换成字节
im = Image.open("./logo.jpg")
im.save("未加密_logo.jpg", exif=exif_bytes)#保存成新图片,加上exif信息
# 填充信息 加密 这里我们简单的以base64加密为例子,对作者信息进行加密,当然实际上应该采用更高级的手段
exif_dict["0th"][piexif.ImageIFD.Artist] = base64.b64encode("江湖人称王某人的程序员".encode('utf-8'))#修改作者信息
exif_dict["Exif"][piexif.ExifIFD.DateTimeOriginal] = u"2021:06:19 10:10:10".encode()#修改拍摄时间 时间格式不能错
exif_dict["0th"][piexif.ImageIFD.Software] = "优快云".encode()#修改版权
exif_bytes = piexif.dump(exif_dict)# 转换成字节
im = Image.open("./logo.jpg")
im.save("加密_logo.jpg", exif=exif_bytes)#保存成新图片,加上exif信息
#接下来我们解密图片信息
exif_dict = piexif.load('./加密_logo.jpg')
author=exif_dict["0th"].get(piexif.ImageIFD.Artist,"")
print(base64.b64decode(author).decode())
# 查看MD5
getPictureMD5("./logo.jpg")
我们发现只要文件被修改,MD5就会改变,MD5是文件的唯一标识
三、结果
四、总结
我曾经考虑过直接对图片内容进行修改,比如对于某个固定位置上的像素点加上1,视觉上差异不大,但是实际上隐含着我加入的信息,但是难度很大。接着考虑修改Exif信息,但是该信息可以被修改,接着是对图片加水印,除非对水印进行涂抹,否则不会被更改,但是水印影响美观,接着想到了差分隐私,但是我对该领域不熟。回归本质,实际上我只想在图片不被修改的情况下可以溯源,而又不想泄露发布者的隐私,因此采用改方法,可以屏蔽一大部分人,根据时间戳我们可以得到传播链。