【隐私大战】App在偷听你的生活吗?

2024-02-15 11:10
文章标签 app 隐私 大战 生活 偷听

本文主要是介绍【隐私大战】App在偷听你的生活吗?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转载本文需注明出处:微信公众号EAWorld,违者必究。

产品经理

4/18 9:00

做个需求,监听一下用户今天说过哪些关键词(商品),等它打开App的时候精准推送给它,三天上线可以吧?

‍‍‍‍

4/18 9:01

。。。。。。

开发

4/21 9:00

为什么我每次刚说完要买什么东西,再打开购物软件时,首页总是会无比惊悚的来一个精准推荐呢?它们肯定偷听了!

4/21 9:01

嘘,少胡说八道。

读书人的事,那能叫偷嘛。

产品经理

哼,早晚抓它们进去陪张三!

每当跟朋友聊天说到什么商品后,再次打开某条某宝就会看到一些精准的推荐,好像App“听”到了我们的谈话一样,相信很多小伙伴都感同身受。

到底App有没有悄悄地监听呢?

洗白开始

心理学中有一种叫做"孕妇效应”,就是当人怀孕了就更容易发现孕妇,你开了奔驰就更容易看到奔驰,你拎个LV就发现满大街都是LV。

其实App首页每天都有包包,你今天恰巧跟同事说到要买,回去再打开某宝发现居然真的给你推荐了包包?

好像也像那么回事。

继续诡辩

首先,想要录音App总得有录音权限吧,你来教我在哪里申请权限?

第二,录音得到的数据是离线处理还是传到后台处理呢,就算以低码率录音,每天也要产生至少1个G的录音数据。

第三,用户群体中不说普通话的用户比例有多少,目前语音识别率在我们日常对话的场景里还不够,更别说方言了。

第四,对于每天都在进化的国产系统,长时间使用录音接口,最新的MIUI是会弹窗提示的,弹窗点进去还可以一键关闭当前App的录音权限,不要小看了这些厂商的安全能力。

第五,大多数公司都有自建的基于用户习惯等维度的推荐系统,有着完备的用户画像,你非要这么玩,事情败露了你担得起吗!

真没问题?

在当今移动互联网环境下,想要证实或者证伪都很有难度,所以只能希望大家相信大厂,相信科技向善,相信王欣,相信......除非找到了代码实锤。

实现原理

不管大厂有没有做,我们仍然对此好奇从技术上能否实现这一操作,让我们来看一下可行的方案。

方法A

App借助比如发送语音、语音搜索、语音输入等功能获取到录音权限,之后就在后台间歇性启动录音,并识别其中的关键词,推荐系统获取到关键词之后就可以进行精准推荐了。

由于App申请权限只有第一次会弹框给用户确认, 所以获取权限之后可以随意启动录音。

当然,也可以App启动时申请录音权限,不同意就退出应用,呵呵,真想打死你。

方法B

大数据背景下的数据共享。

App不去主动监听用户的谈话内容,可以向已经窃听到相关数据的厂商付费购买,App之间共享数据在技术上是很成熟的,那么手机里只要有一款App获取到敏感数据,你的隐私将不复存在。

说的好听是"数据共享",实际上不就是出售用户数据嘛,做的那么过分,真当黑哥不接单的?

欢迎大家把怀疑的App发在评论区~ 

我先来,XX输入法

方法C

加速度传感器窃听。

“加速度传感器是目前智能手机中最常见的一种嵌入式传感器,它主要用于探测手机本身的移动,常见的应用场景包括移动检测,步数统计和游戏控制等。”

由于声音信号是一种由震动产生的可以通过气态,液态,固态的各类介质进行传播的声波,而手机扬声器发出的声音会作用在手机上引起震动,这种震动可以被手机上的加速度传感器灵敏的捕捉到,因此可以通过加速度传感器的数据提取出关键字信息。

这并非耸人听闻,由浙江大学、麦吉尔大学、多伦多大学团队共同发表了有关加速度传感器窃听的成果(https://dwz.cn/dgkygjzH),经过测试,关键词的识别准确率达到了90%。

更加可怕的是在现行法律下,采集智能设备传感器数据这一行为并不违法,这也就意味着这种窃听方式目前还处于法律的灰色地带。而且在智能手机上获取传感器数据对于用户来说是无感知的,无需用户确认便可以获取相关权限。

实践

接下来,我们将就方法A搭建项目并实现,项目源码会放在结尾处。

使用到的技术

本次实践使用PermissionAnywhere进行录音权限的申请(请参考《如何优雅地申请Android运行时权限》),百度语音识别sdk完成录音转文字,使用Blob云数据库实现数据上传云端。

权限

使用PermissionAnywhere申请录音权限

(https://github.com/mingyuers/PermissionAnywhere)

PermissionAnywhere.requestPermission(this, new String[]{Manifest.permission.RECORD_AUDIO}, new PermissionCallback() {@Overridepublic void onComplete(List<String> grantedPermissions, List<String> deniedPermissions, List<String> alwaysDeniedPermissions) {if (grantedPermissions != null) {//开始录音start();}}
});

(左右滑动查看全部代码)

录音及识别

使用百度语音识别的sdk,将录音转化为文字。

private void start() {asr = EventManagerFactory.create(context, "asr");Map<String, Object> params = new LinkedHashMap<String, Object>();String event  = SpeechConstant.ASR_START; params.put(SpeechConstant.ACCEPT_AUDIO_VOLUME, false);params.put(SpeechConstant.PID, 1537); // 中文输入法模型,有逗号String json = new JSONObject(params).toString(); // 这里可以替换成你需要测试的jsonasr.send(event, json, null, 0, 0);
}

(左右滑动查看全部代码)

上传

上传阶段我们使用了Bmob的sdk,直接将录音得到的数据上传到云数据库。

public void upload(String str) {RecordBean recordBean = new RecordBean("q8", str);recordBean.save(new SaveListener<String>() {@Overridepublic void done(String s, BmobException e) {Log.d(TAG, "done: " + s);}});
}

(左右滑动查看全部代码)

效果

我们可以看到,申请到手机录音权限后,将手机放在一旁,只要我们在说话,App就会录音并识别出来,也可以按需求提取其中的关键字,识别率还是不错的。

代码下载地址

以上完整代码已开源到:

github[https://github.com/mingyuers/FuckRecord]

先说好,仅供大家研究学习。<手动狗头>

写在最后

2016年,支付宝被爆出每隔X分钟(服务端指定)会在后台开启摄像头拍照,录音X秒,然后上传到服务器上。不过后来也被支付宝官方辟谣,并声称不会在用户不知情的情况下对用户进行拍照、录音。

我们愿意相信大厂,毕竟他们有大把的方案去做精准推荐。但只要拥有相关权限,就的确能做到在后台神不知鬼不觉的做一些事情,这种事情永远不会有结果。

科技,我劝你向善。当然,老罗除外。

关于作者:明月,现任普元移动团队资深开发工程师,长期致力于IT技术研究,产品设计和开发等工作,擅长Java、NodeJs、ReactNative等领域技术。先后参加深圳登、太平洋保险等移动项目的实施,参与Mobile 8.0移动平台的设计开发工作。

关于EAWorld:微服务,DevOps,数据治理,移动架构原创技术分享。长按二维码关注!

这篇关于【隐私大战】App在偷听你的生活吗?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/711223

相关文章

MFC中App,Doc,MainFrame,View各指针的互相获取

纸上得来终觉浅,为了熟悉获取方法,我建了个SDI。 首先说明这四个类的执行顺序是App->Doc->Main->View 另外添加CDialog类获得各个指针的方法。 多文档的获取有点小区别,有时间也总结一下。 //  App void CSDIApp::OnApp() {      //  App      //  Doc     CDocument *pD

ConstraintLayout布局里的一个属性app:layout_constraintDimensionRatio

ConstraintLayout 这是一个约束布局,可以尽可能的减少布局的嵌套。有一个属性特别好用,可以用来动态限制宽或者高app:layout_constraintDimensionRatio 关于app:layout_constraintDimensionRatio参数 app:layout_constraintDimensionRatio=“h,1:1” 表示高度height是动态变化

App Store最低版本要求汇总

1,自此日期起: 2024 年 4 月 29 日 自 2024 年 4 月 29 日起,上传到 App Store Connect 的 App 必须是使用 Xcode 15 为 iOS 17、iPadOS 17、Apple tvOS 17 或 watchOS 10 构建的 App。将 iOS App 提交至 App Store - Apple Developer 2,最低XCode版本 Xcod

鸿蒙自动化发布测试版本app

创建API客户端 API客户端是AppGallery Connect用于管理用户访问AppGallery Connect API的身份凭据,您可以给不同角色创建不同的API客户端,使不同角色可以访问对应权限的AppGallery Connect API。在访问某个API前,必须创建有权访问该API的API客户端。 1.登录AppGallery Connect网站,选择“用户与访问”。选择左侧

隐私计算实训营:SplitRec:当拆分学习遇上推荐系统

拆分学习的概念 拆分学习的核心思想是拆分网络结构。每一个参与方拥有模型结构的一部分,所有参与方的模型合在一起形成一个完整的模型。训练过程中,不同参与方只对本地模型进行正向或者反向传播计算,并将计算结果传递给下一个参与方。多个参与方通过联合模型进行训练直至最终收敛。 一个典型的拆分学习例子: Alice持有数据和基础模型。Bob只有数据、基础模型和fuse模型。 Alice使用自己的数据

Xinstall助力App全渠道统计,参数传递下载提升用户体验!

在移动互联网时代,App已成为我们日常生活中不可或缺的一部分。然而,对于App开发者来说,如何有效地推广和运营自己的应用,却是一个不小的挑战。尤其是在面对众多渠道、复杂的数据统计和用户需求多样化的情况下,如何精准地触达目标用户,提升用户的下载、安装和活跃度,更是考验着每一个运营者的智慧。 今天,我们就来揭秘一个能够帮助App开发者解决这些痛点的神器——Xinstall。作为一家一站式App全渠道

Flask 创建app 时候传入的 static_folder 和 static_url_path参数理解

Flask 在创建app的时候 是用 app = Flask(__name__) 来创建的,不传入 static_folder参数的话 ,默认的静态文件的位置是在 static目录下 我们可以进入 Flask的源码里面查看 ctrl+鼠标左键进入 这是Flask的 __init__源码(后面还有一些,我就选了需要的代码)     def __init__(self,import_

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFArra

这个错误说的是一个不可变数组负值给了一个可变的数组。有可能你前面定义的数组是一个可变数组,但是在你其他方法里面用他的时候,他就是一个不可变数组,因为在可变数组拿到别的地方用的时候,他会默认为不可变的,可能这只是一个类里面你只是简单的声明了他吧,并没有进行对他初始化,或者分配什么内存,所以他只是一个不可变的数组,当你在其他地方用他的时候,他就默认为不可变的数组,他可能因为你的没分配内存,而变回不可变

app提交到腾讯开发平台,提示无法获取签名信息,请上传有效包(110506)

最近提交APP时遇到的,一般情况下是因为打包时至勾选v2没有勾选v1的原因,如下图: 这个时候将v1勾选即可。 但是在打包时ˉv1和v2都勾选了也可能会出现这个报错,那就要看一下gradle的 minSdkVersion,如果这个版本在24-26之间也可能会提示这个错误,所以降低这个版本就可以了

基于Python的电商导购APP设计与实现

基于Python的电商导购APP设计与实现 Design and Implementation of an E-commerce Shopping Guide App based on Python 完整下载链接:基于Python的电商导购APP设计与实现 文章目录 基于Python的电商导购APP设计与实现摘要第一章 简介1.1 研究背景1.2 研究目的1.3 研究方法1.4 论文结