当前位置: 首页 > 科技观察

微信原图是救命还是泄露隐私?就看你怎么用了!

时间:2023-03-17 15:17:05 科技观察

1。前言最近看到有人讨论微信原图泄露隐私。原因好像是有人在社交媒体上发了一张照片,然后被网友定位到了具体的居住区域,甚至直接定位到了小区、楼层等信息,想想还是很恐怖的.在此次事件“定位网友”的过程中,很大一部分信息其实来自照片本身内容泄露的信息。各种警匪片你应该都看过。专业人士可以从一张照片中分析出很多有用的信息。例如,从窗户射进来的阳光的角度,可以分析房间的朝向。有一些镜面反光,也可以分析拍出来的照片。有关环境等的更多信息。但是说到微信原图暴露的信息,其实就是我们拍照时照片中携带的Exif信息。这个Exif信息就是相机在拍照的时候专门记录的一些属性信息和拍摄数据。比如GPS定位数据,拍摄时间,拍摄时相机的方向等。Exif信息只是拍摄图片文件的固有信息,不仅仅是微信分享原图,其实,如果您以任何形式共享源文件,它将携带此信息。但是GPS涉及到定位,定位信息在一些人眼里是比较“敏感”的信息。为什么说是某些人呢?图片所携带的位置信息,如果暴露了,确实可能会带来麻烦,但在某些时候,却可以挽救生命。比如《民警巧用图片定位,解救被骗 CX 组织受害人》这样的新闻,我想大家应该都看过了。另外,很多人反映不使用原图会导致接收到的图像模糊(压缩),这也是为什么有些人更喜欢发送“原图”的原因。一方面确实有隐私保护的需求,另一方面也有发送无损原图的需求。微信怎么解决的?发送图片时,提供“原图”选项,选择是否发送图片源文件的权利交给用户自己。值得一提的是,微信发送图片时,出于传输效率和隐私的考虑,默认发送压缩图片。在压缩过程中,EXIF信息会被清理掉,所以如果找不到“原图”选项,那么说明这里只支持“压缩图”,比如朋友圈。至此,就清楚了,微信原图所谓泄露的隐私,只是图片在拍摄时存储的固有信息EXIF,只要对EXIF信息进行处理,就会被删除。所以如果想让对方收到EXIF信息,就发送原图;否则,您可以在发送前压缩它。到这里就结束了,不过作为一个技术公众号,还是继续科普一下照片的EXIF信息以及Android开发中如何读取和修改。2.图片的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上很多图片压缩库都是借用或引用它实现的。在鲁班的Engine.java文件中,可以找到相关代码。逻辑很简单,就是在压缩之前,先将图片按照Exif中记录的方向进行旋转,然后再进行处理。这就是为什么图片被压缩后,虽然Exif信息被抹掉了,但是图片显示的方向还是正确的。2.3压缩后保留Exif信息。我实在想不出有什么场景需要在压缩后保留这些信息。但如果需要的话,最简单的处理方法就是读取并存储压缩前图片的Exif,压缩后写入图片中。那么这又涉及到,我们如何对读写图片的Exif信息进行编码。3.操作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.+"支持包和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是一个不精确的数据,它没有任何必填的tag字段,每个tag字段的值都是可选的,所以我们在读取的时候,一定要考虑读取时的异常处理。3.4写入Exif信息ExifInterface其实是不可信的,只能作为参考。因为任何程序都可以修改它。要修改Exif信息,可以使用setAttribute()方法,该方法接收一个键值对。用于标记要修改的Tag和最终修改的值。修改完成后需要调用saveAttributes()方法,否则设置的Exif信息不会写入图片文件。另外需要注意的是,虽然文档中显示Exif信息是弱校验数据,但是对TAG的值有要求。如果不是自己定义的值,保存时不会报错,但读取时,会返回null。4.小结至此,大家应该清楚了,微信原图泄露的只是拍照时相机应用写入图片的固有信息。没有太多秘密。当图像被压缩时,这些信息将被删除。去。最后总结一下:拍照的时候会把Exif信息写入图片文件,直接发送文件的时候会保留这些信息。99%的图像压缩将删除Exif信息。Android下读取Exif信息,可以使用ExifInterface。【本文为专栏作家“张扬”原创稿件,转载请微信公众号联系作者获取授权】点此查看该作者更多好文