如何设计一个好用的防疫码

目前,中国大陆各省、自治区、直辖市和江苏各市以及外交部都有各自的防疫码。防疫码设计之初是为了简化进入公共场所的登记手续,提高登记率,便于进行流行病学调查。

这一功能也可以被刷身份证的健康码核验一体机所替代。在读取身份证信息后由核验终端直接向服务器拉取有关信息,这对用户来说自然如刷卡般自然优雅,但这东西相对一张复印纸可贵多了,就算小型化也不会便宜点,一个身份证读头就要几百块(当然这东西读卡器本身不贵而是贵在其他东西上),成本应该和一台警务通或者POS机差不多,恐怕没办法大量推广。抛开造价这东西也要有稳定的网络连接和电源才行。

当然,iOS的暴露通知和Android的新冠肺炎 (COVID-19) 患者接触史通知系统可以更精确且匿名的进行流行病学调查:它们基于BLE技术每10-20分钟生成一个随机ID并对外广播,其他手机会记录接收到的ID,在机主确诊后记录到的ID将被公布,其他手机会将这些ID与自身生成的ID比对,如果一致则可确认接触。由于BLE的工作特性,广播传输距离通常只有十几米,它们远比防疫码以建筑物为单位进行的流调更加精确。

而防疫码唯一的优点就是便宜:公共场所运营者无需配备专用设备和网络接入,只需要打印一张二维码就可以,所有成本均由用户承担。这听起来是不是像极了当年中国移动支付QR码打败NFC的原因。

而如今,防疫码的展码(他扫你)这一行为也被更多的应用在全民核酸筛查中。防疫码设计之初可能并没有想到这个用途(至少由腾讯开发的龙江健康码是这样),使用龙江健康码进行核酸检测登记时的交互过程如下:居民打开龙江健康码;登记人员扫描龙江健康码,(以下过程为我推测)此时,登记人员的终端会将码内的codeId字段回传服务器并解析个人信息再传回终端;由于健康码并不包含手机号信息(虽然我也觉得很离谱,明明进行实名制验证时已经索取了手机号并进行了短信验证)登记人员会人工登记手机号;完成登记后,身份信息会连同采样管编号上传至服务器,与之后的核酸检测结果进行关联。

不知道你发没发现这里的问题:整个交互完全依赖与服务器端交互,而且并没有比使用身份证读头直接读取身份证内信息再人工登记手机号更方便。在日活千万级别的系统上,我这种嵌入式出身的工程师没办法理解为什么要无条件相信服务器核传输链路的稳定性。事实上,它们也确实不靠谱。至少我既经历过防疫人员没信号导致必须去楼外才行,但楼外阳光强扫码成功率又低;和服务器崩溃导致核酸检测中断,居民只能回家等通知的情况。

对于哈尔滨来说,目前的操作流程甚至已经是优化过的!没错,他们还设计出过更糟糕的系统。旧系统叫做哈尔滨市核酸检测登记小程序,可以在微信搜索体验。流程如下:首先居民需要扫码打开小程序;然后要人工填写调查表,保存调查表后排队等待;快轮到时,登记人员会拿着一支采样管沿队伍依次登记;登记方法为居民打开小程序扫描采样管的条形码读入采样管编号,然后自行提交至服务器。整个流程中只要有人操作手机不流程或手机摄像头扫码困难就会被拖慢;而且服务器不仅需要面对更多的交互甚至还会应对高几个数量级的并发;更要命的是只要有人改变队伍顺序就会导致采样数据与人关联不上。当然,这套系统也不出意料的经常崩溃。

刚刚大量报道的齐齐哈尔给老年人发的实体核酸检测码就更离谱,我解了一下新闻上的码才发现他们竟然又造了个轮子…龙江健康码本身是一个静态码,设计时就考虑了用户端离线商家侧在线的方式,老年人可以直接打印使用。仔细一查,好家伙他们不是自己搞了核酸检测登记的码而是搞了个鹤城平安码(由齐齐哈尔移动公司设计维护),这东西的用途就是填身份证号手机号和姓名然后提交验证,验证通过之后会给你一个龙江健康码的小程序码再长按扫描去小程序登记…典型的脱裤子放屁行为…同时应用龙江健康码、鹤城平安码、国务院防疫健康信息码和通信研究院通信大数据行程码…属实是离谱他妈给离谱开门咯。

而且,它不验证手机号,没有CAPTCHA,但是身份证号和姓名的验证是真的…这很离谱了,可以利用这东西验证任何人的身份证号,甚至在知道一个人身份证开头、生日的情况下(这并不罕见,前六位在各种公示信息中并不会被隐藏,生日不是敏感信息很容易获取)写一个自动化脚本小几百次就可以轻松枚举验证出身份证的后4位(身份证最后一位是校验码可以算出来,倒数4-2位是登记顺序,一个城市一天出生的婴儿不过几百人,男单女双还能砍掉一半)

一个合格的防疫码应兼顾:核酸采样过程可以全本地化操作,不会泄露个人隐私,需要时除在线验证外也可以离线验证真伪和有效性。

所以,防疫码的编码应包括两段:静态部分和动态部分。

动态部分为:防疫码类型(红、黄、绿码)、时间码和对静态动态整段信息的HMAC。只要在验证设备内置HMAC密钥则可以离线验证。定期更换密钥并在验证设备间同步即可保证安全性。

静态部分可以有两种设计,匿名化的服务器端token核对方式;或系统间兼容性更强的离线解码方式将。

token核对方式在核酸检测登记时只记录和上传token,如果网络中断可以把token和对应的样本编号存储在本地待网络恢复时再上次。所有信息由服务器对照数据库进行登记。缺点是登记人员无法核对信息真伪,也无法看到信息。

离线解码方式可以将核酸检测需登记的:姓名、身份证号、手机号编码(可以加密,但没必要。固化密钥在系统开发公司间共享并不能提供多少安全性,HDCP就是前车之鉴)。登记时终端设备对防疫码静态部分进行解码即可。由于静态部分保持不变,老年人完全可以将任意时刻的防疫码打印出来以便核酸登记使用。网络中断时缓存中过期的防疫码依然可以保证核酸检测正常进行,登记用终端只需将数据缓存待网络恢复上传即可。

互联网公司的产品经理和程序员们还是被服务器集群几乎没有上限的资源惯坏了。扫码登记这个活嵌入式工程师给一片MCU接个串口输出的扫码枪就能干,不想联网用上位机直接存SD卡里也不是不行,一台上位机带个十几二十个登记工位还不跟玩一样。在终端机上装两个读码器,一个读采样管的标签一个读居民防疫码,采样管放进机器自动读标签然后和后续防疫码匹配,采满了拿出来换个新的插进去就行,连登记的人都可以省掉了。

koupit-pilulky.com

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据