找回密码
 会员注册
查看: 31|回复: 0

微信原图到底在救人,还是在泄露隐私?取决于你怎么用!

[复制链接]

2万

主题

0

回帖

6万

积分

超级版主

积分
64454
发表于 2024-9-21 01:19:56 | 显示全部楼层 |阅读模式
@JeffersonPalomique一.序最近又看到有人在讨论,微信原图泄露隐私的事情。起因好像是有人在社交媒体上发布了一张照片,然后被网友定位到具体的生活范围,甚至直接定位到居住的小区,楼层门牌号等信息,想想还是很可怕的。在这个事件中的「网友定位」过程,其实很大一部分信息来自照片内容本身泄露的信息。各种警匪片大家应该也看过,专业人士可以通过一张照片分析出很多有用的信息,例如从窗户阳光的晒入角度,就可以分析出房间的朝向,有一些镜面的反光,也可以分析拍照环境的更多信息等等。但这里说到微信原图暴露的信息,其实就是我们拍照时,在照片中携带的Exif信息。这个Exif信息是相机在拍照时,专门记录的一些属性信息和拍摄数据。例如GPS定位数据、拍摄时间、拍摄时相机的方向等。Exif信息只是拍摄文件的固有信息,不光微信原图分享,其实你通过任何形式,将源文件分享出去,都是会携带这些信息。但其中GPS涉及到定位,而定位信息又是一个在某些人看来,比较「敏感」的信息。为什么说是某些人呢?携带的定位信息,暴露出去确实可能会造成困扰,但是某些时刻,这又是可以救命的,例如《民警巧用定位,解救被骗CX组织受害人》之类的新闻,我想大家应该也看过。另外也有很多人反映,不使用原图会导致接收到的模糊(被压缩),这也是一部分人偏爱发送「原图」的原因。一边确实有隐私保护的需求,另一边也有发送无损原图的需要。微信是怎么解决的呢?在发送的时候,提供了一个「原图」的选项,将是否发送源文件的选择权,交到了用户自己的手里。值得一提的是,微信发送,为了传输效率以及隐私的考虑,默认是发送压缩后的的,在压缩的过程中,会清理EXIF信息,所以如果你找不到「原图」的选项,那么就说明这里只支持发送「压缩图」,例如微信朋友圈。到这就清晰了,所谓微信原图泄露的隐私,只是在拍摄时存入的固有信息EXIF,而只要通过处理EXIF信息就会被抹去。所以如果想对方接收到EXIF信息,就发送原图,反之则可以通过压缩处理一下再发送。本来到这里就算完了,不过作为一个技术向的公众号,我们再继续科普一下照片EXIF信息以及在Android开发时如何读取和修改它。二.的EXIF2.1什么是Exif?Exif(Exchangeableimagefileformat)表示可交换图像文件格式,是专门记录数码相机拍照时的一些参数,例如定位信息、拍摄设备方向、曝光、色彩等信息,并将这些信息写入文件中,以保证在传输时保留这些信息。Exif可以被附加到JPEG、TIFF、RIFF等文件中,简单来说,文件中有一块特殊的区域,可以存放一些额外的Exif信息,以保证我们在使用时更方便。这本身没什么坏处,除了GPS定位信息会让我们敏感之外,其他信息更多的是为了辅助我们使用。例如前面提到的拍摄照片时,设备的方向信息,就可以保证无论我们拍照时,手机的方向是侧着的或者是倒着的,拍照后在相册中预览时,永远保持正着的原因。一般的处理软件,都可以读取出的Exif信息,并且支持修改。随便找一个在线查看Exif信息的工具网站,就可以查看到我上传的Exif信息。的Exif信息,没有任何的保护,我们可以对其任意的修改。但是这些信息你也看到了,没有修改的意义,通常就是压缩时直接抹去。2.2压缩会损失Exif压缩会损失掉Exif信息,这也就是为什么在不发送原图的时候,接收者是读取不到Exif信息的。这很好理解,以现在手机摄像头支持的像素来说,一张大画幅的照片,随随便便就是上十MB甚至几十MB,这对发送的网络和存储都是有压力的,所以通常App的做法是在发送前,本地做一次压缩。前面提到,Exif信息会记录拍照时,拍照设备持握的方向,例如有时我们会将手机倒过来拍全身照。这照片在相册展示时,永远都是正确的方向,我不会得到一个头朝下的照片。如果压缩会导致Exif丢失,为什么压缩后的,在显示时依然可以保证显示方向的正确?这就要说到压缩时的策略,我们就拿Android下比较出名的开源压缩库Luban举例,Github上很多压缩库都是借鉴或者引用它来实现的。在Luban的Engine.java文件中,可以找到相关的代码,逻辑很简单,就是在压缩前,先将按照Exif中记录的方向,旋转后再进行处理。这也就是为什么压缩时,虽然抹去了Exif信息,但是显示的方向依然是正确的原因。2.3压缩后保留Exif信息保留Exif信息这种需求,我确实想不到有什么场景需要在压缩后,保留此信息的。但是如果有必要的话,最简单的处理方式,就是在压缩前,将的Exif读取存储,压缩后再写入中。那么这就又涉及到,我们如何编码读取和写入的Exif信息。三.操作Exif信息3.1使用ExifInterface在Android中,需要ExifInterface来读取Exif信息,如果你直接在AS中搜索这个类,可以发现在android.media包下,确实有一个ExifInterface,但是我不建议使用它。自从AndroidSupport25.1.0开始,又添加了一个新的支持库:ExifInterface。这是由于Android7.1对ExifInterface做了重大修改,因此建议使用此Support包,它最低支持到Api9+。随着AndroidX的发布,对ExifInterface也做了迁移支持,只不过现在的版本还是Beta01。使用方式并没有什么太大的差异,完全取决于你项目的要求,这里举例就使用最新的28.+了api "com.android.support:exifiinterface:28.+"Support包和android.media中的ExifInterface基本操作,都是类似的,都提供了对指定的Exif信息进行读写的功能,区别在于Support包中包含了140多个不同的属性,而其中近100个是android7.1中新增的。3.2获取ExifInterfaceExifInterface存在两个构造函数,可以传递一个文件路径或者的InputStream。上面两种构造方式,都可以获取到一个ExifInterface对象。它们之间有些差异:1、使用InputStream获得的ExifInterface无法被修改,而直接读取的文件,则可以修改。2、ExifInterface无法处理远端的InputStream,例如是从HttpURIConnection返回的输入流,所以这里建议使用content://或者file://这种Uri路径。3.3读取Exif信息获得ExifInterface对象之后,就可以对其进行操作。大多数的Exif属性,只需要视情况使用getAttributeInt()、getAttributeDouble()、getAttribute()(适用于String)。它们分别表示不同类型的属性。这些方法接收一个String类型的参数,这些参数都以常量的形式,以TAG_Xxx为开头,被标记在ExifInterface中。具体想知道不同的TAG_Xxx需要使用什么方法获取,可以直接看文档。其中注释就已经标记了该属性代表的类型。下面举个最常见的例子,获取的拍摄方向,用于在显示的时候进行旋转。当然,还有一些其它比较重要的信息,例如谣传微信原图暴露的位置信息,可以通过getLatLong()方法获取到一个float的数组,分别表示经度和维度,getAltitude()获取拍摄的海拔高度,单位是米。还有一些,如果自带缩略图,可以使用getThumbnail()方法获取到。更多操作,详见代码文档,这里就不一一举例了。需要注意的是,Exif是一个不严谨的数据,它不存在任何必须的标记字段,每个标记字段值,都是可选的,所以我们在读取的时候,一定要考虑读取时的异常处理。3.4写入Exif信息ExifInterface其实是不可信的,它只能作为一个参考。因为任何程序都可以对它进行修改。修改Exif信息可以使用setAttribute()方法,它接收一个key-value的键值对。用于标记待修改的Tag和最终修改后的值。在修改完成之后,还需调用saveAttributes()方法,否者不会将设置的Exif信息写入到文件中。还有一点需要注意,虽然文档中表明,Exif信息是一个弱校验的数据,但是它对TAG的值是有要求的,如果不是它本身定义的值,保存并不会报错,但是读取的时候,会返回null。对Exif的使用,这里就不单独举例了,有兴趣可以看看我之前的文章《Android读取Exif示例》四.小结时刻到这里你应该就清楚了,微信原图泄露的只是照相机App在拍照时,对写入的固有信息,并没有什么太多的秘密,这些信息在压缩时就会被抹去。最后再总结一下:在拍照时,会写入Exif信息到文件中,直接发送文件会保留此信息。99%的压缩,都会抹去Exif信息。Android下读取Exif信息,可以使用ExifInterface。本文对你有帮助吗?留言、转发、点好看是最大的支持,谢谢!「联机圆桌」👈推荐我的知识星球,一年50个优质问题,上桌联机学习。公众号后台回复成长『成长』,将会得到我准备的学习资料。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2024-12-28 08:19 , Processed in 0.687319 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表