移动端防截屏录屏技术在百度账户系统实践

news2025/3/17 1:07:24

作者 | Seven

导读

在移动端应用的开发过程中,保护用户隐私和应用内敏感信息安全是一个不可忽视的课题。随着诈骗手段的升级,“共享屏幕”被诈骗分子频频使用,因为密码被泄露而导致受害者财物受损的事情层出不穷。只要开启了“共享屏幕”–本质上是一种录屏,密码、验证码等重要信息就会有被泄露的可能。防止截屏和录屏成为了一个重要的安全措施,特别是对于金融、医疗、企业和高安全要求的应用。本文将介绍一些在iOS和Android平台上实现防截屏和录屏的常见策略和方法,以及在百度账户系统上的实践。

全文4431字,预计阅读时间12分钟。

01 技术研究

1.1 Android平台防截屏策略

Android平台提供了一个更直接的方式来防止应用内容被截屏或录屏。Google 自 Android 4.2(API level 17)引入 FLAG_SECURE,用于将窗口内容标记为安全,禁止在屏幕截图中和非安全的显示器被输出。

/** Window flag: treat the content of the window as secure, preventing
 * it from appearing in screenshots or from being viewed on non-secure
 * displays.
 *
 * <p>See {@link android.view.Display#FLAG_SECURE} for more details about
 * secure surfaces and secure displays.
 */
public static final int FLAG_SECURE             = 0x00002000;

可以在 Activity 中,通过getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE) 来设置。当截屏的时候,系统会弹出一个Toast提示“禁止屏幕抓取”;当录屏的时候,当前设备显示正常且能正常操作,看似能够正常录制,但是保存后的视频,都是一片黑色,并没有APP的相关界面。

探究:FLAG_SECURE 是如何产生作用的

在 Android 图形系统上,一个 Activity 对应创建一个 Surface,每个 Surface 对应 SurfaceFlinger 中的一个 Layer。SurfaceFlinger负责管理、合成所有图层,最终显示在屏幕上。

我们通过 Android 的 源码SurfaceFlinger.cpp 和 Layer.cpp中,可以看到,activity 中设置 FLAG_SECURE 后,显示的 Surface 都是属于SECURE状态,会阻止屏幕内容被捕获。

// Call this before holding mStateLock to avoid any deadlocking.
bool canCaptureBlackoutContent = hasCaptureBlackoutContentPermission();
{   
    ...
    if (!canCaptureBlackoutContent &&
        parent->getDrawingState().flags & layer_state_t::eLayerSecure) {
        ALOGW("Attempting to capture secure layer: PERMISSION_DENIED");
        return PERMISSION_DENIED;
    }
    ...
}

1.2 iOS平台的防截屏录屏方案

在iOS平台,系统并没有直接提供API,去防止被截屏或录屏。在 iOS13之前,主要是通过监听通知,然后采取一些措施。

在 iOS7 上,当用户进行截屏时,系统会发送一个UIApplicationUserDidTakeScreenshotNotification通知。尽管我们不能阻止截屏的发生,但可以使用这一通知来采取某些措施,如模糊屏幕、显示警告或者销毁显示的敏感内容。

// This notification is posted after the user takes a screenshot (for example by pressing both the home and lock screen buttons)
UIKIT_EXTERN NSNotificationName const UIApplicationUserDidTakeScreenshotNotification API_AVAILABLE(ios(7.0));

在 iOS11 上,系统新增了UIScreen的API用以告知应用当前屏幕正在录屏。当UIScreen.isCaptured 为true时,表示当前屏幕正在被录制、镜像或被Airplay 发送。当录屏状态发生变化时,UIKit会发送 UIScreenCapturedDidChangeNotification 的通知。

// Object is the UIScreen which changed. [object isCaptured] is the new value of captured property.
UIKIT_EXTERN NSNotificationName const UIScreenCapturedDidChangeNotification API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(visionos);

在 iOS13 上,UITextField 在设置 secureTextEntry 为 true 时,系统在截屏和录屏时,UITextField 所在的内容会被系统渲染为空白区域。我们可以利用这一特性,把需要视图添加到 UITextField 的子视图上(实际是私有类UITextLayoutCanvasView)来达到防止截屏和录屏的效果。

具体操作:

1、初始化一个textField,并获取其子视图 UITextLayoutCanvasView,下面称为textCanvasView

2、将textCanvasView 添加到控制器的 view 上,作为防护的底层视图

3、将所需防护的 view 添加textCanvasView 上

4、通过事件触发,开启或关闭textField的secureTextEntry属性; 相当于开启或关闭防截屏录屏

其中将防护的 view添加到 textCanvasView上,而非添加到 textField 上。因为在密码模式时,这个view会在截屏或者录屏时隐藏,同时也可以有效避免触摸事件的冲突。另外,textFiled 的secureTextEntry属性没有iOS 系统版本限制,在低版本系统上也可以设置,只是在 iOS13及后续版本上,才具备防止截屏和录屏的特性。

图片

另一台手机录制

图片

当前设备录制

在上面视频中红色背景为 textCanvasView,上面添加了需要防护的视图,输入密码后面的 textfield已开启 secureTextEntry。

可以看到,未开启防护时,截屏和录屏的时候,输入密码的 textfield 内容为空白;开启防护后,textCanvasView及需要防护的视图均已变为空白。

02 百度账户系统应用实践

在账号登录页,账密登录输入密码时,以及修改密码时需要设置防止截屏或录屏。

图片

因为前端本身无法感知到系统的截屏或录屏事件,且不同的前端页面对于防护的需求也有不同,所以设计由前端来控制防护的开关,在 Android 和 iOS 上分端实现具体的防护功能。

2.1 前端应用实践

当进入到账密登录页面或修改页面时,FE 通过端方法控制打开防护,退出页面时,再由端方法来关闭防护。

双端SDK定义的一个端方法名称为 xxx_forbid_record,其中可以通过参数控制是开启或者关闭。

FE在使用时,可以直接通过 window.location.href来调用起拼接的端方法字符串 xxx://xxx_forbid_record/{“status”:“1”},表示要开启防护要禁止截屏和录屏。双端 SDK分别在系统的回调中进行拦截,解析端方法,转化为调用对应原生方法。

2.2 Android实现

在基类Activity中初始化 webview时,去设置防截屏回调,可以通过参数控制 开启或关闭"禁止截屏录屏"功能。

在FE调用时,通过拦截端方法,触发“防截屏回调”,进行实际控制。

如果是开启,则给 window 添加 FLAG_SCCURE 标志;如果是关闭,则通过 clearFlags 方法清除 FLAG_SCCURE标志。

调用端方法开启防护的时候,当前设备实际会提示“该应用不允许屏幕截图”,且不会产生屏幕的实际截图。

录屏时,当前屏幕仍然正常显示和操作,但在录屏生成的视频中,开启防截屏的过程整个屏幕会变成黑色,关闭后防截屏后可以正常显示。

图片

△截屏效果

2.3  iOS实现

在 百度账号 SDK 中,因为通过textfield特性来实现放截屏录屏并不是苹果系统公开的正式 API,从稳定性角度考虑,当前仅是监听了截屏和录屏的通知,通过增加弹窗,提示录屏或截屏风险。

具体实现为:

1、在webivewController中,监听系统截屏通知 UIApplicationUserDidTakeScreenshotNotification,如果是 iOS 11 及以上系统,则同时监听录屏通知 UIScreenCapturedDidChangeNotification。

2、区分录屏 或 截屏场景,进行提示。

3、FE 开启或关闭,SDK中拦截的端方法实现中,设置本地的标识为开启或关闭。

当 FE开启防截屏录屏后,SDK拦截端方法后会首先通过 [UIScreen mainScreen].isCaptured 方法,判断当前是否已经录屏。如果是,则直接弹窗提示。

当收到系统截屏或录屏的通知时,sdk 会判断满足以下两个条件都满足才会进行提示:

1)本地的标识为开启

2)当前页面正在展示

当前页面正在展示上通过 view.window 对象存在,以及 控制器的 isViewLoaded 来判断;增加此条件的判断原因是,从登录页可以打开另外一个其他的页面,在该新页面开启截屏或录屏时,登录页虽然没有显示出来,但仍会接收通知。如果新页面是不需要开启防截屏录屏,那么登录页在收到相关通知后,仅通过本地标识来判断,就出弹出不符合预期的弹窗。

在 百度账号SDK中,当进入密码登录页时,进行截屏和录屏效果如下。

图片

截屏提示

图片

录屏提示

03 总结

防截屏录屏功能是移动应用安全的一个关键组成部分,特别是对于处理敏感数据的应用而言。iOS 虽然未和 Android 一样有系统提供直接的 API,但上述策略和技术可以显著降低信息泄露的风险。开发者在设计应用时,需要权衡用户体验和安全需求,实施适合自己应用场景的防截屏录屏方案。

——END——

推荐阅读

AI Native工程化:百度App AI互动技术实践

揭开事件循环的神秘面纱

百度搜索展现服务重构:进步与优化

百度APP iOS端包体积50M优化实践(七)编译器优化

百度搜索内容HTAP表格存储系统

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1336753.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue3使用Cascader联级选择器的懒加载+回显

效果图 页面代码 // separator是改变文字链接的方式&#xff0c; <el-cascaderseparator"-"v-model"currentRegionList":props"DeptRegionList":options"getRegionList"change"handleRegionListFun"ref"deptRegio…

Java——Windows系统怎么查看某个端口被占用和杀死进程解除占用,看这一篇就够了!!!

Windows系统端口占用 1. netstat -ano2. 查看某端口占用的PID3. tasklist|findstr "PID"4. 解除端口占用 总结 本篇文章介绍一下windows系统中怎么查看某个端口被占用以及如何解除占用。 1. netstat -ano 作用&#xff1a;查看系统中所有端口的占用情况 可以看到本…

面对勒索,金融机构该怎么办?

就在近期&#xff0c;某大行美国子公司被勒索软件攻击&#xff0c;使得部分交易系统中断&#xff0c;该行也在网站确认遭受了勒索软件攻击。这再次引发了金融机构对勒索软件的警惕与担忧&#xff0c;也凸显了一个重要的安全问题&#xff1a;犯罪分子不仅能窃取财产&#xff0c;…

MessageBox和HubSpot:数字化时代综合营销引擎

在数字时代&#xff0c;社交媒体已经成为企业与客户互动的重要平台。然而&#xff0c;随着信息的爆炸性增长&#xff0c;有效管理社交互动变得愈发具有挑战性。企业需要在海量信息中找到并回应关键的用户消息&#xff0c;这正是数字时代社交互动面临的主要挑战。为了解决这一问…

搭建Nginx文件下载站点

一、下载Nginx 首先&#xff0c;确保你的服务器上已经安装了Nginx&#xff0c;使用编译安装&#xff0c;下载最新版Nginx。 wget https://nginx.org/download/nginx-1.25.3.tar.gz tar -xf nginx-1.25.3.tar.gz二、安装Fancyindex和Nginx-Fancyindex-Theme模块 # 下载Fancyin…

k8s中的整体架构 ,pod含义,服务类型,网络通讯等

k8s中的整体架构 &#xff0c;pod含义&#xff0c;服务类型&#xff0c;网络通讯等 k8s整体架构pod内部和pod之间的通讯k8s的组件 k8s整体架构 上图中&#xff0c;较大的红框是k8s中的master节点&#xff0c;负责接受请求&#xff0c;调度任务&#xff0c;管理节点等&#xff0…

【网络奇缘】——奈氏准则和香农定理从理论到实践一站式服务|计算机网络

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 &#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 失真 - 信号的变化 影响信号失真的因素&#xff1a; ​编辑 失真的一种现象&#xff1a;码间…

推广主要指标及定义

推广主要指标以直通车为例解释&#xff0c;如图所示 1.展示量&#xff1a;当消费者搜索某个词&#xff0c;推广计划在天猫直通车展示位上被买家看到的次数&#xff08;去掉被消费者快进划过、主图未完金展现等情况产生的曝光)&#xff1b; 2.点击量&#xff1a;消费者看到广告…

iPad绘画之旅:从小白到文创手账设计的萌系简笔画探索

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 iPad的出现&#xff0c;不仅改变了我们对电子设…

[足式机器人]Part4 南科大高等机器人控制课 CH11 Bascis of Optimization

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;CLEAR_LAB 笔者带更新-运动学 课程主讲教师&#xff1a; Prof. Wei Zhang 课程链接 &#xff1a; https://www.wzhanglab.site/teaching/mee-5114-advanced-control-for-robotics/ 南科大高等机器人控制课 Ch11 Bascis o…

QT小技巧 - 使用QMovie进行gif切帧

简介 使用QMovie 将 gif 进行切帧&#xff0c; magick 进行合并代码 QString gifPath "E:\\workspace\\qt\\gif2imgs\\203526qre64haq3ccoobqi.gif"; // 你的图片QMovie movie(gifPath); movie.setCacheMode(QMovie::CacheNone);qDebug() << movie.frameCou…

Blender动画怎么云渲染?一分钟学会渲染速度提升数十倍

1.Blender为什么需要渲染&#xff1f; Blender是一款功能强大且备受欢迎的开源3D建模和渲染软件&#xff0c;为设计师、艺术家和动画制作人提供了无尽的创作可能。随着其视觉质量和功能的不断提高和完善&#xff0c;Blender项目的渲染时间也显著增加&#xff0c;越来越多的设计…

电子信息工程学Python C++还是Java?

电子信息工程学Python C还是Java? 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「C的资料从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&a…

flex 属性3

order 属性定义项目的排列顺序。数值越小&#xff0c;排列越靠前&#xff0c;默认为0 。 通过align-self 属性&#xff0c;可以单独调整某个伸缩项目的对齐方式 默认值为 auto &#xff0c;表示继承父元素的 align-items 属性。

西南科技大学计算机网络实验二 (IP协议分析与以太网协议分析)

一、实验目的 通过分析由跟踪执行traceroute程序发送和接收捕获得到的IP 数据报,深入研究在IP 数据报中的各种字段,理解IP协议。基于ARP命令和Ethereal进行以太网帧捕获与分析,理解和熟悉ARP协议原理以及以太网帧格式。 二、实验环境 与因特网连接的计算机网络系统;主机操…

Bluetooth Mesh 入门学习干货,参考Nordic资料(更新中)

蓝牙网状网络&#xff08;Bluetooth mesh&#xff09;概念 概述 蓝牙Mesh Profile | Bluetooth Technology Website规范&#xff08;Mesh v1.1 后改名Mesh ProtocolMesh Protocol | Bluetooth Technology WebsiteMesh Protocol&#xff09;是由蓝牙技术联盟(Bluetooth SIG)开…

SpringBoot 3.2.0 基于SpringDoc接入OpenAPI实现接口文档

依赖版本 JDK 17 Spring Boot 3.2.0 SpringDoc 2.3.0 工程源码&#xff1a;Gitee 导入依赖 <properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEnco…

【Ubuntu无法进入系统问题原因及解决方法】

有时因为某些原因&#xff0c;导致破坏了系统使用的某些库&#xff0c;比如libc.so.6被重命名&#xff0c;新替换的库无法兼容。会导致重启后&#xff0c;系统无法启动的现象。 可以通过recovery mode&#xff0c;先进入到系统中&#xff0c;更正错误内容即可。

基于ssm演出人员与观众疫情信息管理系统论文

目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 2 系统开发环境 3 2.1 vue技术 3 2.2 JAVA技术 3 2.3 MYSQL数据库 3 2.4 B/S结构 4 2.5 SSM框架技术 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2 操作可行性 5 3…