版权声明:html
本帐号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影全部。安全
未经容许,不得转载。微信
在咱们开发一些对屏幕显示内容的安全性有要求的 App 的时候,若是后台有运行恶意的程序对这些敏感页面进行截图,就可能致使这些信息的泄露。ide
比较常见的场景,就是微信或者支付宝的付款二维码,若是有恶意程序此时进行截图而且发送出去,就可能致使用户经济上的损失。测试
那么本片文章就如何防止在某些页面内截图的问题,进行一个详尽的讨论。动画
首先须要明确,防止截屏的功能,通常而言都是对 App 内单个页面的,全局禁用也没什么,还可能不利于用户分享传播,一般咱们只须要对敏感页面进行限制便可。3d
这些敏感信息,一方面来自程序根据用户信息,自动生成的,例如前面举例的付款二维码。另一方面,来自用户的主动录入,例如用户本身输入的账号、密码(有些为了怕用户输入错误,有提供显示密码的开关)。code
因此咱们就这两种思路来进行分别的讨论。cdn
对于这种程序自动生成的信息,在开发者看来,只须要保证截屏,截取到的信息是脏数据便可。就是说截屏保存的数据,实际上是已经失效或者过时的便可。server
可是对于 Android 系统而言,截屏并无提供对应的广播或者其它回调来监听它,咱们只能经过其余的方式来解决它。
如今主流的一些思路:
这些思路都是依赖于对方使用的是系统本身提供的截图方式,可能并不能详尽的覆盖到。例如第一种方法,在 onPause() 中刷新数据,其实就是利用了设备在截屏的时候,为了让用户有感知,因此会有一个截图的动画效果来提示用户已经截图成功,在此处被截屏的 Activity 就会走到 onPause() 生命周期内。可是有一些软件的截图方式,是不会有此动画的,因此彻底会致使监听不到而致使信息泄露。
不过这种思路,不是本文的重点,本文的重点主要是第二种方式,这里只是简单介绍一下,以后有时间再作一个详情的讲解。
对于用户主动录入的信息,通常而言,哪怕咱们能够经过第一种方式去修改它,也会很麻烦,最直接的办法,是看能不能直接禁用掉截屏的功能。
实际上,Android 是提供了对应的 Api 的,使用起来也很是的简单,只须要拿到 window 对象,对其添加一个 FLAG_SECURE
的 flag 便可。
完整的代码以下:
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
这里的 window 对象,能够是 Activity.getWindow()
获取的,也能够是 Dialog.getWindow()
获取的,获取 window 的方式不少,这里就不一一举例了。只是使用不一样对象获取到的 Window 对象,禁用截屏的区域也不一样。
大部分状况下都推荐使用这种方法,禁用掉系统截屏的功能,一劳永逸。
FLAG_SECURE 是 WindowManager.LayoutParams
的一个属性,从文档上就能够看出来,它标记当前 window 是安全的,不容许有一些非安全的操做,例如截屏功能。
虽然 FLAG_SECURE
是一个官方推荐的 Flag ,可是咱们仍是须要测试一下是否靠谱。
测试设备 :Letv X600 Android 6.0
首先使用 Android Monitor 进行截图。
以后查阅了一些资料,在一些设备上也有一些不一样的表现,例如,在三星手机上测试,发现会输出一个图片文件,可是内容被像素化了,以下图所示。
FLAG_SECURE
基本上能够保证咱们显示的内容的安全性。可是有一些状况下 ,
FLAG_SECURE
依然会有一些截屏泄露的状况。
由于 FLAG_SECURE
是应用在 Window 对象上的,若是在 Activity 中有一些弹窗或者突出的UI元素,都是不受 Activity 的 Window 对象保护的。例如:在Activity 中弹出对话框,虽然 Activity 被设置为 FLAG_SECURE
,可是若是有一个 Dialog 弹窗,对于弹窗的内容,依然须要单独设置 FLAG_SECURE
。
这些会出现截屏泄露的地方包括:
这些只是一部分,可能还有其余的地方也会形成截屏泄露。
下面展现一个在 @CommonsWare 博客中找到的 gif 图,能够清晰代表在这些状况下,依然是能够截取到内容的,因此咱们在有重要信息须要隐藏的时候,要特别注意这些场景下也别暴露重要信息。
能够看到,在一个被设置为 FLAG_SECURE 的页面中,有些设备上依然会截取出黑色的画面,而这些致使截屏泄露的点,依然是能够截取到图像的。
@CommonsWare 的博客地址:
其实通篇就是在介绍一个 FLAG_SECURE 这个 flag 来保护屏幕的安全,禁止程序进行截屏,可是引伸出一些值得咱们思考的问题。