微信原图泄露的只能是 Exif ,你的隐私不在这!!!
版权声明:
本账号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影所有。
每周会统一更新到这里,如果喜欢,可关注公众号获取最新文章。
未经允许,不得转载。
序
最近很多公众号都推送了关于『微信发送原图泄露隐私』的传言。实际上这里说的泄露,只是发送原图会携带 Exif 信息,而 Exif 信息里会携带一些例如 GPS 定位数据、拍摄时间等等信息。
这些信息基本上任何智能手机或者相机,在拍摄照片的时候,都会自动写入到图片中。而这样的图片只要发送出去,无论是以何种方式,都是会暴露你和图片相关的部分信息,和微信的关系并不大(不过据说发朋友圈的时候,图片都会被压缩,抹去 Exif 信息)。
其实如果比较注重个人信息的话,可以在手机的设置中,关闭定位服务等隐私相关功能,
那么,本文就来聊聊,在 Android 下,读取 Exif 信息你需要知道的所有信息。
一、什么是 Exif
既然要聊到图片的 Exif 信息,那么就先来了解一下什么是 Exif ?
Exif 的全称是(Exchangeable image file format),它是可交换图像文件格式。是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。
Exif 可以被附加在 JPEG、TIFF、RIFF 等文件之中,为其增加有关数码相机拍摄信息的内容和缩略图或图像处理软件的一些版本信息。
上面是维基百科的解释,通俗来将,Exif 可以在图片上附加一些额外的信息,例如拍摄地点,拍摄方向,拍摄的设备信息,拍摄图片的时间等等。这些信息并没有什么坏处,例如最常用拍摄照片的方向信息,所有的图片软件都依赖它的值来确定图片在你设备上显示的方向,这就是你无论手机是倒着拍摄还是横着拍摄,最终呈现在手机上都是正的的原因。
一般图片处理软件都可以读出图片的 Exif 信息,并且可以被修改。我随便找了个在线的查看 Exif 的工具网站,就可以完整的读取出我上传图片的 Exif 信息,下图只是 Exif 信息的一部分。
二、如何读取 Exif
2.1 使用 ExifInterface
在 Android 中,读取 Exif 信息,需要使用到 ExifInterface 这个接口,如果你在 Android 中搜索这个类,可以发现在 android.media 包下,确实有一个 ExifInterface 。
但是从 Android Support 25.1.0 支持库发布之后,又添加了一个新的支持库:ExifInterface 。这是由于 Android 7.1 引入了对框架 ExifInterface 的重大修改,因此使用此 Support 包,可以最低支持到 Api 9+。这里强烈推荐使用 Support 包中的 ExifInterface 。
使用它,需要在 Gradle 中配置依赖,这里使用最新的 26.+。
其实基本功能都是类似的,对嵌入图片文件的 Exif 标记进行读写的功能,区别在于多包含了 140 多个不同的属性(其中近 100 个是 Android 7.1 中新增的)
接下来的内容都是基于 Support 包中的 ExifInterface ,来分析的,实际上 android.media 包下的 ExifInterface 还它在接口上,还是略有差异的。
2.2 获取 ExifInterface
ExifInterface 存在两个构造函数,可以传递一个图片文件路径或者图片的 InputStream。
上面两种构造方式,都可以获取到一个 ExifInterface 对象。
但是他们也是有差异的:
1、使用 InputStream 获得的 ExifInterface 是无法修改的,而直接读取的图片文件,则是可以修改的。
2、ExifInterface 无法处理远程的 InputStream,例如是从 HttpURIConnection 返回的输入流,所以这里建议使用 content://** 或者 file://** 这种 Uri 路径。
2.3 读取 Exif 信息
获得 ExifInterface 对象之后,就可以对其进行操作。
对于大多数属性,只需要视情况使用 getAttributeInt() 、getAttributeDouble() 、getAttribute()(适用于 String)。它们分别表示不同类型的属性。这些方法接收一个 String 类型的参数,这些参数都以常量的形式,以 TAG_Xxx 为开头,被标记在 ExifInterface 中。
具体想知道不同的 TAG_Xxx 需要使用什么方法获取,可以直接看文档。
其中注释就已经标记了该属性代表的类型。
下面举个最常见的例子,获取图片的拍摄方向,用于在显示的时候进行旋转。
当然,还有一些其它比较重要的信息,例如谣传微信暴露的位置信息,可以通过 getLatLong() 方法获取到一个 float 的数组,分别表示经度和维度,getAltitude() 获取拍摄的海拔高度,单位是 米 。还有一些图片,如果自带缩略图,可以使用 getThumbnail() 方法获取到。更多操作,详见代码文档,这里就不一一举例了。
需要注意的是,ExifInterface 是一个不严谨的数据,它不存在任何必须的标记字段,每个标记字段值,都是可选的,所以我们在读取的时候,一定要考虑到没有读取到 Exif 数据的情况,如何处理。缺少 Exif 数据不一定是因为特定的属性没有数据,还有可能是某些格式根本不支持 Exif 信息(例如,PNG 和 WebP )。
2.4 写入 Exit 信息
ExifInterface 其实是不可信的,它只能作为一个参考。因为任何程序都可以对它进行修改。
修改 Exif 信息可以使用 setAttribute() 方法,它接收一个 key-value 的键值对。用于标记待修改的 Tag 和最终修改后的值。修改完成之后,还需要调用 saveAttributes() 方法,否者不会将设置的 Exif 信息写入到图片文件中。
虽然文档中,描述
saveAttributes()方法是一个耗时操作,推荐使用setAttribute(),但是实际测试来看,不调用saveAttributes(),是不会保存数据的。这个实际操作起来,在模拟器上会有短暂的卡顿,但是真机上并不存在这样的情况。
还有一点需要注意,虽然文档中表明,Exif 信息是一个弱校验的数据,但是它对 TAG 的值是有要求的,如果不是它本身定义的值,保存并不会报错,但是读取的时候,会返回 null 。
三、举个例子
既然已经讲解清楚 ExifInterface 的使用细节,接下来使用一个 Demo 来展示它具体的操作细节。
首先定义三个按钮,如下图:
输出 Exif 信息,按钮逻辑:
读取 Exif 信息,按钮逻辑:
写入 Exif 信息,按钮逻辑:
运行的效果如下:
四、小结
到这里基本上就讲解清楚 Exif 在 Android 中的所有细节。可以看到实际上 Exif 的信息并不可信,也并不安全,所以你女友要是拿着你分享的照片说你为什么这个时间出现在这里,你应该知道如何圆回去,全是 Exif 的锅。
微信原图泄露的只能是 Exif ,你的隐私不在这!!!的更多相关文章
- 解决微信OAuth2.0网页授权回调域名只能设置一个的问题
https://github.com/HADB/GetWeixinCode GetWeixinCode 解决微信OAuth2.0网页授权回调域名只能设置一个的问题 使用方法 部署get-weixin- ...
- 转载:解决微信OAuth2.0网页授权回调域名只能设置一个的问题
项目地址:https://github.com/HADB/GetWeixinCode 说明:微信项目很多,但是回调域名有限,经常使用,做个笔记. 解决微信OAuth2.0网页授权只能设置一个回调域名的 ...
- android黑科技系列——微信定位聊天记录中照片的位置信息插件开发详解
一.前言 最近关于微信中,朋友之间发送原图就可能暴露你的位置信息,其实这个问题不在于微信,微信是为了更好的体验效果,才有发送原图功能,而对于拍照,发送普通图片微信后台都会过滤图片的exif信息,这样就 ...
- 换个角度看微信小程序[推荐]
去年参加几次技术沙龙时,我注意到一个有意思的现象:与之前大家统一接受的换名片不同,有些人并不愿意被添加微信好友--"不好意思,不熟的人不加微信". 这个现象之所以有意思,是因为名片 ...
- 微信小程序-WebSocket
wx.connectSocket(OBJECT) 创建一个 WebSocket 连接:一个微信小程序同时只能有一个 WebSocket 连接,如果当前已存在一个 WebSocket 连接,会自动关闭该 ...
- 微信订阅号里实现oauth授权登录,并获取用户信息 (完整篇)
摘要 这段时间一直有人问我,订阅号实现的oauth授权登录的问题,之前写的比较简单,很多人不明白.众所周知,微信公众号分订阅号.服务号.企业号:每个号的用途不一样,接口开放程度也不一样.微信还有个扯淡 ...
- 微信公共服务平台开发(.Net 的实现)11-------客服消息(定项消息推送 重要的OPENID)
这次我们来一起研究一下“客服消息”,首先明确一下“客服消息”的概念.这不同于之前的“被动响应消息”,也就是说并不是之前“你一言我一语的即时响应”,可能在某种情况下你需要给不同的人主动发送消息,例如你的 ...
- asp.net微信开发第六篇----高级群发(文本)
说到高级群发,微信的参考资料http://mp.weixin.qq.com/wiki/14/0c53fac3bdec3906aaa36987b91d64ea.html 首先我们先来讲解一下群发文本信息 ...
- 他们最先开发微信小程序,为何现在又退出了?
1.当前现状 这几天大家又被微信小程序刷屏了,"得到"退出了小程序,"今日头条"暂停了服务,各种股票交易类的小程序也在证监会的要求下纷纷暂停服务.如果大家还不知 ...
随机推荐
- 玩玩微信公众号Java版之准备
微信自2013年流行起来,现在的发展已经超过了我们的想象,那么对应的公众平台,小程序等都是让人眼前一亮的东西,这里来学习一下微信工作号的对接,实现为Java,希望大家一起学习! 这里大概描述一下所 ...
- markdown 常用格式API
摘要 记录常用格式 参考:https://www.zybuluo.com/mdeditor 1. 标题 写法: 文字前加 #, 几个# 表示几级标题 标题下方增加 = 或 - 效果 标题1 标题2 标 ...
- javascript中typeof和instanceof用法的总结
今天在看相应的javascript书籍时,遇到了typeof和instanceof的问题,一直不太懂,特地查资料总结如下: JavaScript 中 typeof 和 instanceof 常用来判断 ...
- 手把手教小白如何用css+js实现页面中图片放大展示效果
1.前言 很多童鞋会在项目中遇到一些上传图片,展示图片的操作,但是图片呢有大有小,为了页面的美观,有时候我们需要将图片展示成固定宽高度,但是呢,领导就会说,我想看大图片,怎么办?想看就看呀, ...
- Eclipse、maven项目常见问题
阿里云maven仓库地址: <mirror> <id>nexus-aliyun</id> <mirrorOf>*</mirrorOf> &l ...
- 蓝桥杯比赛javaB组练习《饮料换购》
题目如下: 饮料换购 乐羊羊饮料厂正在举办一次促销优惠活动.乐羊羊C型饮料,凭3个瓶盖可以再换一瓶C型饮料,并且可以一直循环下去,但不允许赊账. 请你计算一下,如果小明不浪费瓶盖,尽量地参加活动,那么 ...
- 那些年,用C#调用过的外部Dll
经常有人找到我咨询以前在csdn资源里分享的dll调用.算算也写过N多接口程序.翻一翻试试写篇随笔. 明华IC读写器DLL 爱迪尔门锁接口DLL 通用OPOS指令打印之北洋pos打印机dll 明泰非接 ...
- Comparable与Comparator,java中的排序与比较
1:比较和排序的概念 比较:两个实体类之间按>,=,<进行比较. 排序:在集合类中,对集合类中的实体进行排序.排序基于的算法基于实体类提供的比较函数. 基本型别都提供了默认的比较算法,如s ...
- NYOJ--32--SEARCH--组合数
按照思路写:深搜,r控制位数,位数为0输出否则递归 /* Name: NYOJ--32--搜索--组合数 Date: 14/04/17 16:48 Description: 深度优先搜索 */ #in ...
- 6.linux下部署 web 项目
安装java 1.下载 linux 环境的jdk 2.上传该压缩包到 linux 系统中并且解压 tar -zxvf 压缩包名 3.配置环境变量并且刷新配置 export JAVA_HOME=/ali ...