移动互联时代:数字身份的安全重塑
|
去年4月,我们在西溪园区B座三楼那个漏风的会议室搞数字身份联邦验证联调,空调一直嗡嗡响,像台快散架的老电梯在爬楼。老杨当时就坐我斜对面,手机壳裂了三条缝,正用牙咬开一包山楂片——他前天刚被运营拉去测完低端机白屏率,说帧率个位数那会儿手都在抖。 我原以为只是换个OIDC Provider的事,结果连着三天在dev环境里撞见同一串错误:ID token签名校验过,但sub claim里嵌套的手机号后四位居然是base64乱码。我们对着RFC7519文档一句句抠,发现不是JWT格式问题,是下游身份源系统把“+86 1381234”这个字段,在拼JSON之前先做了次URL decode,而前端又在fetch headers里多塞了个Accept-Encoding: gzip……对,就是那个gzip。最后定位到是网关层某个Nginx模块默认开启了gzip压缩,但没配charset,把UTF-8的加号+解成了空格,再进后端一序列化,+86就变空格86,手机号就飞了。我敢打包票,那个+号就是在nginx.conf里第312行错配的gzip_types里漏掉了application/jose+jws类型。 但你说这事怪谁?运营上周在站会上还举着她那台红米Note 9——屏幕右下角有个拇指大的黄斑,她说:“咱们用户可不管token结构,只管登不登得上。”她边说边戳手机,屏幕黄斑跟着她指甲一起反光。技术方案讨论到一半,她助理推门进来递了杯瑞幸,杯子上印着“小鹿茶·限定款”,杯盖没拧紧,咖啡晃出来滴在会议纪要打印稿第三页,正好糊住“零信任网关接入路径”那行字。
文章配图,仅供参考 组件库选型撕逼那会儿我也在场。A组拿React写了一套WebAuthn绑定页,B组Vue那边同步做了个PKCE授权回调拦截器。上线前夜压测,突然发现iOS 15.4以下设备在Safari里调用navigator.credentials.get()时,Promise resolve出来的AssertionResponse里response.clientDataJSON字段,base64url解码后多了个BOM头。没人碰过这玩意——因为Chrome从来不出BOM,Android Webview也从来不加,唯独苹果那个私有实现,在生成clientDataJSON前偷偷往JSON字符串开头塞了个U+FEFF。我们三个后端、两个前端、一个安全同事,盯着Wireshark抓包里那段0xef 0xbb 0xbf发了六分钟呆。期间保洁阿姨来换垃圾袋,塑料袋窸窣响了三次,没人抬头。 优胜劣汰?呵。这话我在去年双十一前夜听到的。那天凌晨两点,监控告警说认证服务TPS掉到四百,但我们日志里根本没报错。后来扒trace才发现,是CDN节点缓存了某次带恶意Referer头的预检请求响应,把Access-Control-Allow-Origin: 缓存了三分钟——而这三分钟里所有跨域鉴权请求都被浏览器拦了。可这事儿查清之后呢?产品说:“反正降级成账号密码登录也够用”。他们不知道的是,那个Referer其实是某个钓鱼H5页面伪造的,它本身并不调我们的接口,只是诱骗用户点开后,再用iframe悄悄加载我们的OAuth授权页。真正的攻击不在链路里,而在用户视线之外的那个弹窗。这个我说不准,但我知道我们那晚没动防火墙规则,只清了CDN缓存——清了七次,中间断网一次,是运维老周蹲在机柜旁重启光纤收发器,他袜子破了洞,左脚大拇指露在外面。 还有件事,你肯定记得:去年Q2初,公司要求所有新App强制开启生物密钥绑定。结果第一批灰度发出去,三星S21用户集体闪退。不是Crash,是LaunchScreen卡死在启动图上不动,logcat里只有两行:E/Trusty: [trusty_app] ta_open failed, err=0xffffffe7;E/Auth: FIDO2 init failed。我们以为又是HAL层兼容问题,翻了三天高通QSSI文档,最后发现是系统证书白名单里缺了一条CN=AndroidKeystore,O=Google,L=Mountain View。补进去当天下午就过了。但第二天财务部反馈,报销系统里三十七张发票OCR识别失败——全是因为他们刚把安卓版APP升级到了新SDK,而那个SDK里的tflite模型居然偷偷替换了assets目录下的ic_launcher.png,把原本1024×1024的图标压缩成192×192还加了抗锯齿滤镜,导致OCR引擎把发票代码框误识别成“IC-LAUNCHER-V2-NEW”。这跟数字身份没关系,但我那天看见测试妹子一边嚼薄荷糖一边改正则表达式,糖纸折成小方块堆在键盘右边,叠了十一层。 所以我现在写了个小工具,就几行Shell:自动检测Android设备是否支持KeyAttestation,如果不支持,立刻切回TOTP fallback,且本地存储一个标记,下次启动直接跳过生物密钥流程。不优雅,但上线后首屏认证成功率从八十二提到了九十六。当然,这只是临时方案。至于到底该不该用FIDO2作为移动侧唯一身份锚点?我还在等Google公布那个被搁置的Android 15 KeyStore API更新时间表——听说他们内部吵了七轮,最后一次评审会上,有人摔了iPad,屏幕没裂,支架螺丝掉了两颗,到现在还躺在会议室地毯缝里。我没去现场,但听老杨说的,他当时正用那个iPad调试AR扫码登录,摔完他还顺手把螺丝捡起来,放进了山楂片空包装袋里。 下个月我要重跑一遍WebAuthn on WebView的兼容矩阵,这次加测华为鸿蒙4.2的自研内核行为。不过今天得先帮老杨修好他电脑上那个CI构建失败的问题——他build脚本里写死了node_modules/.bin/ts-node路径,但新装的pnpm会把它软链到.pnpm/node_modules/.bin下面。这事儿跟我负责的数字身份一点关系都没有,但他说他明天就得交白屏率报告。行吧,我这就去。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

