Day 29. 手机萤幕截图安全性问题,小心被看光光

今天来讲讲手机app截图安全性问题

IOS 截图是系统层级因此安全问题不大,但还是需要适时提醒使用者

在Android 上可就要小心了,若是下载到恶意 App 也可以使用者截图盗走

因此在包含个人资讯,付款资讯上的页面就要慎重的处理

image-20201014100559938

资安检测-安全敏感性资料保护复习

我们在 Day 07. 资安检测 (II) 4.1.2 安全敏感性资料保护

里面有一点 4.1.2.3.9 行动应用程序画面撷取警示

其中行动应用程序於非使用者主动进行的画面撷取时应主动警示使用者

主要针对 Android 系统,系统被背景命令触发时发动的截图

但在Android 系统命令触发时,App内并无手段可以侦测 adb shell screencap

adb shell screencap - p /sdcard/Download/1.png

上行程序码为在debug模式并执行程序码, 若可以正常被截图,此项目就会视为不符合

由於这条很靠北特别,只能在有帐密个资等全部页面加上 FLAG_SECURE,才能通过检验『Android 禁止截图』

iOS 需做到截图时通知使用者『iOS截图侦测』即可通过此项目

IOS 截图侦测

侦测 userDidTakeScreenshotNotification

let mainQueue = OperationQueue.main
NotificationCenter.default.addObserver(forName: UIApplication.userDidTakeScreenshotNotification, object: nil, queue: mainQueue) { notification in
    print("撷取图片")
}

iOS 无法做到,禁止截图,只能通知使用者萤幕已经截图

Android 侦测截图

由於 Android 不像iOS 有系统级的方法可以侦测

因此只能土炮自行侦测,目前有两种方式侦测截图,另外一种是侦测键,但是因为厂商太多每支手机都不同因此可靠度太低

  • 利用FileObserver监听某个目录中资源变化情况

    • 所需权限:READ_EXTERNAL_STORAGE
  • 利用ContentObserver监听全部资源的变化

    • 所需权限:INTERNAL_CONTENT_URIEXTERNAL_CONTENT_URI

这边说明用 FileObserver 为例

权限设定

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

程序码

public class ScreenshotActivity extends AppCompatActivity {
  private final String TAG = "Screenshot";
  private static final String PATH = Environment.getExternalStorageDirectory()   File.separator 
  Environment.DIRECTORY_PICTURES   File.separator   "Screenshots"   File.separator;
  
  protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_screenshot);
    mFileObserver = new CustomFileObserver(PATH);
  }
  @Override
  protected void onResume() {
    super.onResume();
    mFileObserver.startWatching();
    Log.d(TAG, PATH);
  }
  @Override
    protected void onStop() {
    super.onStop();
    mFileObserver.stopWatching();
  }
  /**
  * 目录监听器
  */
  private class CustomFileObserver extends FileObserver {
    private String mPath;
    public CustomFileObserver(String path) {
    super(path);
    this.mPath = path;
  }
  public CustomFileObserver(String path, int mask) {
    super(path, mask);
    this.mPath = path;
  }
  @Override
  public void onEvent(int event, String path) {
    Log.d(TAG, path   " "   event);
    // 监听到事件,做一些过滤去重处理操作
    }
  }
}

Android 禁止截图

FLAG_SECURE Android 官方文件说明

FLAG_SECURE 是 WindowManager.LayoutParams 的一个属性

它标记当前 window 是安全的,不允许有一些非安全的操作,例如截图功能。

FLAG_SECURE flag 设定後会有以下功能:

  1. 阻止萤幕截图

  2. 在Recent apps(任务切换介面)中只显示应用名字和图示, 不显示内容

  3. Google App的Now on tap功能不会去分析你的页面的内容

程序码

getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);

window.addFlags(WindowManager.LayoutParams.FLAG_SECURE);

参考资料

https://developer.android.com/reference/android/view/WindowManager.LayoutParams

https://medium.com/swlh/how-to-make-your-ios-app-secure-from-screen-shot-and-recording-82b6aea26b33

https://www.itread01.com/fxefy.html


<<:  JS AJAX基础实作(4) DAY29

>>:  [Re:PixiJS - Day44] pixi-particles 粒子效果 2/2:实作应用

纯手工打造UART版资料清洗工具之 PySide2 GUI 大补帖 - Part B

从七月开始从零开始研究PySide2 GUI相关设计及程序如何撰写,已经有一段时间了,笔者深深有感,...

暴力攻击(Brute Force Attack)

-图片来源:Toussaint Ilboudo 我碰到了有关卢克小组中的暴力攻击事件的帖子,并恭敬...

Day19 vue.js之我的专案显示

延续昨日 今天从我的专案开始 老样子先新增一个project.vue 再来去加入新的path 然後先...

【第12天】训练模型-Learning Rate

摘要 浅谈Learning Rate 1.1 简介 1.2 示意图 Learning Rate的策略...

【Day28】反馈元件 - Modal

元件介绍 Modal 元件为弹出相关元件提供了重要的基础建设,如 Dialog、Popover、Dr...