如何在Python中更改图片的MD5哈希?

2 投票
3 回答
7196 浏览
提问于 2025-04-17 18:09

我有一个图片文件,想用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'

撰写回答