基于Accessability Service实现的常见聊天软件的文本加解密

教程
自由软件与信息安全

#1

近日,一位新入驻的左派技术大佬(论坛 @pyre ) 发现了一款叫做oversec的可以用于多个android软件上的文本加解密辅助工具,他先把这东西告诉了策划组,然后策划组找到我,与我测试后,感觉还不错,鼓励我写篇教程。

虽然体验良好,但个人不是很看好这款软件(因为毕竟会话这块上已经有了更安全的xmpp),但觉得作为某些特定场景下的消遣或许可以一用。例如个别时候的群M(message),联系不上XMPP又需要紧急留言等等——所以最后我还是决定来写篇教程,向大家介绍下oversec。



oversec是一款开源的自由软件,近日在F-droid上发布。根据其官网( https://www.oversec.io/ )的介绍,这款软件的原理是基于accessability serivce 工作的,它取得捕捉应用屏幕的文字的权限,通过检测其中的可能的加密文本来进行即时解密,解密成功后将明文显示在原消息的上方。这一系列过程都是在聊天软件之外完成的(只不过最后显示在聊天上方而已),所以聊天软件并不知道自己已经发送或者接受到了一条包含加密内容的信息,而外部监测者也无从破解这些密文。这个过程中既不在本地产生任何文件,也不向服务器上传文件。这至少可以保证,其他人无法通过截取设备文件的方式窃取到明文。

oversec使用范围极为广泛,像在Wechat,Whatsapp™, Line™, Snapchat™, Instagram™ 以及中国人常用的QQ等等常见的聊天软件上都可运行。

Oversec自己生成的密钥采用的是对称密钥加密法:ChaCha20 cipher + Poly1305 MAC,也支持导入PGP的非对称密钥(需要使用另一个app: OpenKeychain,f-droid有下载)。一旦密钥丢失或者删除,就无法解密屏幕上的密文。


说了这么多,让我们来实操下。

第一步:下载 F-droid

F-droid是一个只提供自由软件的应用商店。混论坛的人都知道,自由软件对用户的忠诚度更高,一般来说更可靠和安全。应用商店下载:

https://f-droid.org/zh_Hans/

安装后更新库,然后可搜索安装oversec

第二步:安装并配置oversec

oversec需要涉及对应用屏幕文字的获取以及显示在其他应用上方等各种权限,所以建议安装后,在手机设置里开启相应的权限。必要的时候请给予它全部权限。特别注意开启允许悬浮窗的权限。

初次打开oversec,会提示设置为辅助应用,确定并设置。

之后,在APPS选项中勾选想要使用的app,确定。

第三步:打开其他聊天软件,进行实践(以qq为例)

下面以麻花疼的QQ为例展示使用。

1.按钮介绍

打开QQ后,oversec可用的标志是在qq界面上方出现几个纽扣按钮。通过这些按钮来控制oversec的操作。默认开启的有:

  • 隐藏按钮,图标是 :no_entry_sign:,控制oversec其他按钮的隐藏或者恢复。隐藏时oversec不可用
  • 设置按钮,图标是齿轮,通过它配置某一特定app上的oversec参数
  • 加密按钮,图标是锁,点击消息框可见,通过它控制加密。长按进入加密的详细设置页面

初次使用几乎不需要进行任何特殊配置,设置按钮里面的OPTIONS大家应该都能看懂,是显示/隐藏各种按钮的。VISUAL是对话框的调整,请根据喜好酌情调整。LAB中可以开启Expand decrypted text选项,功能是使得对话框长度等于文本长度。

长按锁状按钮,弹出加密详情页面。在此,你可以导入PGP密钥(未测),创建一个随机对称密钥(SYMMETRIC),或者直接选择密码聊天(PASSWORD)。从安全性讲,从左到右安全性递减。在这个页面可以删除或添加密码密钥;若想添加或删除对称密钥,请到oversec的应用设置“KEY”里进行。如果想启用某一密钥,勾选后,点击锁是保存并退出

2.密钥管理

我只测了后两种加密方式。所以在这里先介绍对称密钥加密和密码加密。

sketch1547218764751

对称密钥加密(SYMMETRIC)

  • 创建:本地创建一个265-bit 的密钥,你会为它设置一个密码(建议强密,实在不行也可以点继续使用),用于每次使用该密钥解密消息或者进行敏感操作时候验证操作者身份。这一密码我称之为“个人密码”。每一个密钥都会有一个个人密码。持有同一把密钥的人,可以解密消息。
    可以通过两种方式创建对称密钥。一种是Random Key(随机创建),另一种是Password-based Key(基于共同密码)。随机创建的密钥具有初始的唯一性,若想使用它进行对话,则需要后续分享给别人;基于密码创建的密钥适合于多人群聊,只要创建时输入一致的passphrase,就可以立即创建一致的密钥,省去了密钥的分发环节。但因此,基于密码的对称密钥也相对不安全。
  • 分享:以对称密钥方式聊天的前提是对方也持有这把密钥。所以你得想办法把创建的密钥以其他安全的方式分享出去(基于password的创建不存在此问题)。点击Oversec应用,在KEY选项卡中可以分享密钥,Send encrypted(以加密文件的方式分享)和View/Print 我都没有测试成功,看起来oversec对文件发送的支持不是很好。在通过这两种方式分享密钥的时候,需要创建一个分享密码(分享密码不是个人密码,是用于密钥导入时候使用的密码)。如果各位坚持要使用Send…来分享密钥,唯一稍微可行的方式,是在分享的时候选择分享至条码扫描类的软件,这样可以读取到一张二维码图片,进行分享(别人拿到后,导入也需要输入分享密码)。
    还有一种分享方式是直接通过二维码分享了。双方见面的时候通过二维码导入是最安全的。如果是网友,则建议截图后选择走firefox send传输。oversec默认是阻止截图的,可以在setting中关闭阻止。通过此方式分享不能设置分享密码。
  • 导入:密钥都是通过二维码导入的。导入后需要自己为之命名,并设置一个属于你这台机器上的该密钥的个人密码(同样地,用于敏感操作时验证身份)。
  • 使用:在聊天界面,长按锁状图标,勾选密钥,确定。然后就可以使用密钥加解密了。注意,用某一密钥解密文本时需要输入该密钥的个人密码

密码加密(PASSWORD / passphrase)

  • 比起稍微复杂的对称密钥,使用密码来加解密聊天,就比较容易了。因此密码加密的效果也不如密钥。
  • 创建密码:长按锁状纽扣,弹出设置页面,选择最后一个password,设置密码,然后保存,勾选,再点锁退出。
  • 分享和导入:密码加密不存在分享和导入问题,只要双方输入同样的password并启用之,就能解密。由此可以互发消息,因此必须确保密码不泄露
  • 使用: 长按锁状纽扣,选择密码,点锁,保存退出即启用。

3.聊天

在聊天时,先正常输入文字,然后点下锁状纽扣,实现加密,然后发送。发出去的就是加密过后的文本了!

再点下锁,则又切换会正常文字输入状态。

如果多疑,为防范QQ 危信这类流氓软件对于“待发消息框”的监控,你还可以在设置按钮中开启Compose Button,即单独开设一个窗口进行文本的加解密操作,完了复制粘贴即可。

4.一些小提示

上面就是oversec全部基本情况的介绍了。完了还想和大家分享下使用过程中的一些小注意事项。

  • 能强密就强密(用各种杂乱大小写字母和符号组成的密码),特别是在进行密码聊天和设置分享密码的时候。
  • 个人密码要牢记。每一个密钥都可以设置一个个人密码,用于使用该密钥的各种操作时候验证身份用。
  • 一旦在加密纽扣设置中删除密码,或者删掉密钥,则已有的文本无法解密。
  • 分享密钥的时候一定要选择安全的方式,例如如果通过send encrypted分享,就一定要设置分享密码,并且以安全渠道告知接受者;如直接截屏二维码,则需要以firefox send,pgp加密等安全方式发送给别人。
  • 密码解密密文时,不受勾选与否的约束,这意味着可以勾选多个密码,解密不受影响;但是否会造成加密的混乱,不得而知(例如启用多个密码加密的情况下,默认是哪一串密码加密,暂不得而知)。
  • 密码聊天(区别与对称密钥KEY)仅适用于临时会话场景,没有root的手机极有可能在清后台后连带保存的密码一概删除,KEY则可以长期保存。


结语:oversec可以当作娱乐和消遣的玩具来使用,但它并不是万能的。因为采用的仍然是以对称加密和相对固定的密钥为主,并且在交换密钥时可能有坑,发送消息又依赖于QQ危信这类非自由通讯软件,所以安全性显然次于XMPP。

XMPP至少在两个方面优于oversec:第一,XMPP自身是有自由软件实现的公开标准协议,它的客户端是自由的、透明的;第二,XMPP所支持的OTR协议是一种专门为会话而设计的更为强大的加密工具,它的密钥是每发一条消息更换一次,并且不涉及单独传输密钥的问题,因而更加安全。

OTR 实现完备前向安全性的方式是极其多疑的:

发送方由己方的源和对方的像算出共享秘密,并派生出加密钥,再由加密钥派生出认证钥,用加密钥加密消息,随机生成一个新的 DH 源值替换现有的源并计算出新的像,将 双方的像序号、己方的新像、密文等 组合在一起发给对方,附加通过认证钥为上述内容生成的消息认证码,也一并发给对方,随后更新己方的像序号。

接收方收到消息后,同样算出共享秘密并派生出加密钥和认证钥,用认证钥确认消息的完整性,用加密钥解密密文,并用发来的数据更新缓存的 对方的像及其序号 。可见一方的 DH 参数(源和对应的像)是在发送过程中更新的,如果某方在一段时间内只接收而不发送消息,则其 DH 参数保持不变。

可见 OTR 每发一条新消息都会为下一条消息重新做 DH 协商,从而每条消息都使用不同的加密钥加密,以此逼近 一次性便条 的安全性。


#2

使用OPPO手机的同志注意,OPPO最新的系统要在手机管家中打开权限隐私–悬浮窗管理中允许Oversec应用悬浮窗,才能够正常出现上面说明中的几个按钮。


#3

应多名同志要求,开设测试群。已经使用上,等待测试,或者想学习使用的朋友,请加请q请群
838126150


#4

谢谢安利。已安装。
最新版1.5.7添加了中文支持,不过仍有一些翻译问题。