开发一个自用的身份验证器
蒲衣子曰:“而乃今知之乎?有虞氏不及泰氏。 有虞氏,其犹臧仁以要人,亦得人矣,而未始出于非人。 泰氏,其卧徐徐,其觉于于;一以己为马,一以己为牛; 其知情信,其德甚真,而未始入于非人。”
近日,终于完成了自用的第一个生产力的作品——TOTP 身份验证器。 其实很早就新建了文件夹,但是由于机缘未到(拖延症),前不久才完成了基础的功能,到现在,就记录一下。
动机
之前用过一些验证器软件,包括大公司推出的产品,微软的 Microsoft Authenticator 和谷歌的 Google Authenticator ,以及开源的项目 2FAS 和 Aegis 。
对这类软件,基本的功能,就是生成验证码。此外最好还能同步数据,并且保障安全,密钥不泄漏。
对于商业化的大公司的产品,一般会对其收集隐私和遥测追踪的行为感到担忧;而开源的独立项目,数据同步一般又依赖于第三方的云服务。
首先数据最好都放在自己手里,但也能够安全的同步到可控的云端,防止设备丢失。同时使用起来不应该有额外的门槛,比如谷歌的服务,普通的网络通常是连接不上。
正好最近看到有一些 totp 的工具库,想到为什么不自己动手写一个呢。
设计
- 使用 ReactNative + Expo 打包出安卓应用,直接安装的手机上,省去了部署前端服务引起的风险。
- 使用
otpauth的 npm 包生成基于时间的验证码,支持 ReactNative 环境。 - 使用
expo-camera实现对二维码的扫码解析功能。 - 使用
expo-local-authentication提供指纹识别本地认证。 - 使用自托管的 Forgejo 实例提供给的 Forgejo API 作为后端,通过接口请求将重要数据加密之后,存放到 git 仓库。这样有了版本控制之后,就算误操作也能找回了。
- 之前为了博客,维护了一套矢量图标库,正好这里可以用到。为每一个条目提供图标,并且完全可维护,不用担心图标缺失的问题。
本来 expo-secure-store 提供一个加密键值对的安全存储的功能,但是说一些平台有限制 2048 字节的大小。最后换回普通的本地存储。
成果
通过 Forgejo API 实现了对 git 仓库的增删改查之后,顺手还做了一个简单的笔记功能。
目前实现了验证码的编辑新增和展示,已经满足了基本的可用。
界面虽然简陋,但也不影响使用。