如何在Python中更改图片的MD5哈希?
我有一个图片文件,想用Python来编辑这个图片,但又不想让图片看起来有任何变化,同时还要改变这个文件的MD5哈希值。
请问有什么好的方法可以做到这一点呢?
3 个回答
2
可以使用@Martijn Pieters的方案:只需在头部或其他安全的地方更改一个位。
或者更简单一点,如果你可以改变文件大小:在文件末尾加一个'\0'
(其实加任何字符都可以)。这样文件仍然是一个有效的JPEG文件,而且看起来不会有任何变化。
echo -n ' ' >> my_image.jpeg
还有一种简单的解决办法是:
- 把图像的一个颜色通道转换到傅里叶空间(使用dft/fft),
- 在低频部分(通常存储在二维数组的右下角)更改一些像素值,
- 然后再把图像转换回图像空间(使用ifft)。
这样所有的像素都会不同,但视觉上几乎没有变化。
3
import hashlib
hashlib.md5(open('image.png','rb').read()).hexdigest() # rb = readbyte ,so it will work for text as well as media (image,video) files
输出 >>> '724c6d87452c3a137ef1499c2d4b6576' # 这是一个md5哈希值
file = open('image.png', 'rb').read()
with open('new_image.png', 'wb') as new_file:
new_file.write(file+'\0') #here we are adding a null to change the file content
hashlib.md5(open('new_image.png','rb').read()).hexdigest()
输出 >>> 'a345838e8af07b65344e19989c7c5d85' # 这是同一个媒体文件的新md5哈希值
2
我最后使用了 pyexiv2 来修改图片的元数据,像这样:
>>> md5sum('photo.jpg')
'89dd603a0ce14750799a5144a56fbc12'
>>> image = pyexiv2.ImageMetadata('photo.jpg')
>>> image.read()
>>> image['Exif.Image.ImageDescription'] = '%030x' % random.randrange(256**15)
>>> image.write()
>>> md5sum('photo.jpg')
'426cc91835e7f4f5e92c5a48850adc05'