· engineering· 约 17 分钟精读
Shared Device Operator Attribution Role Separation Offline — Technical Analysis | KeyRotate Technology
一台工地平板在一个班次里被多名作业人员轮流使用,而设备里只有一份单例签名。本文以密旋科技 TagWorks 与 SlingGuard 的归属模型为样本,区分执行主体、签核主体与授权主体三种语义,拆解记录级操作者字段与设备级单例身份的作用域边界,梳理记录级署名前置、敏感字段分域、报告署名按记录绑定与严格场景按角色分设备四条实现线,并把"持机者是否就是署名人"这一无法自证的问题如实写成能力边界。
一、一台工地平板上,站着不止一个人
某电气服务承包商的现场班组共用一台平板电脑,装的是密旋科技 TagWorks。早班两名作业人员轮流用它完成配电箱内手持电动工具的检验并录入记录,午后换第三名人员继续。设备上没有账户,没有登录,也没有服务器——整本台账连同照片都在这台平板的本地目录里。傍晚,班组把台账导成一份 PDF 报告交给甲方。
问题出在报告的落款上。报告底部的操作者签名框,用的是设备里保存的那一张签名位图;而每一条检验记录里,又各自写着一名操作者的名字。当天三个人都用过这台设备,于是”这份报告是谁签的”就从一句话变成了一道需要解释的题。
这不是产品缺陷,而是把一台单机工具放进多人共用场景后必然浮现的工程问题。本文以密旋科技 TagWorks 与 SlingGuard 两个端侧离线工具的归属模型为样本,拆解这个问题,并给出在”没有账户、没有后端”这一前提下能做的分区,以及做不到时必须如实写下的边界。
二、当前实现的归属面:一张设备级身份,加上逐条记录的名字
先看数据落在哪里。
TagWorks 的身份信息由一份单例管理器持有:公司名称、检验员姓名与检验员执照号存在设备的用户偏好设置里,操作者签名则以一张 PNG 位图的形式存放在应用文档目录下。整台设备上这套身份只有一份,它是设备级的。与之并列,每一条检验记录自身带有 technicianName 字段,记录这次操作由谁执行;当一次不合格记录被修复并放行时,还有 releaseAuthorizedBy 字段记录放行经手人。
SlingGuard 的结构同源:一份 CompanyProfile 结构体保存公司名、场点、检验员姓名、认证编号以及签名位图数据,是设备级的唯一一份;每条检验记录则携带 inspectorName、认证编号、authenticatedBy 与 releasedBy 等字段,属于记录级。
把两种产品的归属面并排看,可以列成下表。
| 归属面 | 作用域 | 承载内容 | 缺失时的表现 |
|---|---|---|---|
| 公司 / 检验机构名称 | 设备级 | 报告抬头 | 报告抬头留空 |
| 检验员姓名与执照 / 认证编号 | 设备级 | 报告落款资质 | 落款降级为占位符 |
| 操作者签名位图 | 设备级 | 报告签名框图像 | 签名框为空 |
| 记录级执行者 | 记录级 | 本次操作谁执行 | 记录无从归属 |
| 放行 / 授权经手人 | 记录级 | 谁决定放行或报废 | 放行动作无经手人 |
这张表说明了一件常被忽略的事:同一台设备上,归属信息其实分布在两个不同的作用域里。公司名、执照号与签名位图是设备级的单例;执行者与放行者是记录级的字段。两者平时各司其职,只有在多人共用一台设备时才会互相错位。
三、一句”谁签的”里,藏着三种不同的主体
把”归属”这个词拆开,会发现它至少包含三层语义,而这三层在现实里可以指向不同的人。
执行主体是真正在现场操作设备、按下按钮、录入读数的人。它对应记录里的 technicianName 或 inspectorName,是逐条记录的字段。
签核主体出现在报告落款处。它对应设备里保存的那一份签名位图与执照号——按当前实现,它是设备级的,也就是”这台设备当前预设的检验员”。
授权主体则是决定一件不合格设备能否重新投入使用的人。它对应放行记录里的 releaseAuthorizedBy 或 releasedBy。在起重吊索具场景里,这层语义尤其明确:英国 LOLER 1998 要求由胜任人员(Competent Person)实施彻底检验[2],检验结论与放行处置可以分属不同环节;美国 OSHA 29 CFR 1910.184 同样把合格判定(qualified person)与现场使用检验区分开[3]。
在只有一个操作者的单人设备上,这三层语义恰好重合,看不出区别。一旦一台设备在一个班次里被多人轮流使用,三者就开始分叉:报告落款处那张设备级签名,是否就等于当天实际操作的那名作业人员?放行记录上的名字,是否就是实施检验的那个人?
四、角色分离:把选择权留给现场,而不是替现场做决定
工程上处理这件事的起点,是把角色当作不同的字段,而不是把所有人压进一个”操作者”格子。
先看现状里已经做对的部分。两个产品都把放行当作一个独立动作:TagWorks 的记录带有 kind 字段,取值可以是检验、修复、复检或放行,放行记录另有 releaseAuthorizedBy 字段;SlingGuard 的检验记录以 authenticatedBy 与 releasedBy 分别标注核验经手人与放行经手人。这意味着数据模型在结构上已经允许”执行者”和”放行者”是两个不同的名字,而不是强制它们相等。
需要谨慎的地方在报告层。报告底部的签名框由设备级签名位图驱动。如果一次放行记录与一次检验记录共用同一张签名位图,那么视觉上两者看起来像是同一个人签的,即便记录字段里写着两个不同的名字。这时,签名的图像意义与字段的文字意义就可能不一致。
职责分离(Segregation of Duties)作为一项通用控制原则,要点正是让授权与执行由不同主体承担,以降低单点失误与单点越权的风险[7]。把它落到一台离线设备上,可执行的形态并不是强制拦截——现场往往只有一个人在场,硬性禁止一人两职只会逼出变通做法——而是在数据与呈现两层都保留区分:允许记录声明执行者与放行者不同,允许报告为放行行单独标注经手人,而不是用一张共享签名把两个角色抹平。
五、没有账户的前提下,分区能落在哪四条线上
密旋科技的端侧工具在架构上选择了无账户、无后端、零遥测。这个选择带来一个直接后果:不存在”登录身份”可以自动绑定操作者。因此,分区只能落在数据与流程上,而不能落在认证上。可落地的有四条线。
第一条,记录级署名前置。归属信息的第一落点应当是记录,而不是设备配置。作业人员在开始一次新的检验之前,应用应当显式确认”本次由谁执行”。这样做把归属写在产生它的那一条记录上,而不是依赖一个可能已经过期的设备级默认值。
第二条,敏感字段按作用域分域。公司或检验机构名称属于组织信息,放在设备级是合理的——它是报告抬头,不指向某个自然人。但个人执照号、个人签名位图属于个人信息,把它们作为设备级单例长期驻留在一台多人共用的设备上,意味着任何拿起这台设备的人都能读到甚至套用。工程上的处理是把组织字段与个人字段分开对待:组织字段可以共享,个人字段应随记录或随显式交接出现。这一取舍与数据最小化原则一致——处理个人数据应当限于实现目的所必需的范围[4]。
第三条,报告生成时按记录绑定署名。导出报告不应无条件套用设备里存着的那张签名,而应当对照记录的操作者字段:若记录声明的执行者与设备预设的检验员一致,则沿用;若不一致,则提示经手人确认,而不是默默盖上一枚不相干的签名。这一步成本很低,却把”报告是谁签的”从默认行为变成了显式动作。
第四条,严格场景按角色分设备。对于把职责分离写进内部程序的机构,最诚实的做法是一人一设备,或按角色分设备(检验岗与放行岗各持一台),而不是用一台共用设备去模拟逐人身份。端侧离线工具应当承认这条现实边界,而不是承诺一份共享设备能提供它给不出的逐人可追溯性。
六、代价与边界:签名是图像,不是密钥
把边界写清楚,比把话说满更有用。下表逐项列出当前端侧实现的现状与后果。
| 想证明的事 | 端侧现状 | 后果 |
|---|---|---|
| 这条记录由某人完成 | 操作者是记录里的自填字符串 | 能证明”记录声明了执行者”,不能证明”该执行者确实执行” |
| 报告署名属于署名人 | 签名是设备级位图,无逐人密钥 | 任何持有该设备的人都能套用这张签名 |
| 无法代签 | 无逐人认证环节 | 做不到;只能靠显式交接与人工纪律约束 |
| 放行者与执行者不同 | 记录字段允许不同,报告可分别标注 | 能如实呈现两个角色,但不能强制其为两人 |
第三行需要一个交代。这里的”签名”是一张栅格图像,它证明的是”某个署名的样貌被记录进了文件”,而不是”某个持有私钥的人对这份内容做了密码学签名”。数字签名之所以能绑定身份,靠的是只有本人掌握的私钥;而一张共享设备上的位图没有这层秘密,任何拿到设备的人都可以使用它。两者在名称上相近,在能力上相差很远,混用是常见的误解。图像签名的来历与边界,在摄影与文件元数据一类规范里也有相近的讨论路径[6]。
第四行则是职责分离的能力上限:离线工具可以在数据结构与报告呈现上保留执行与放行的区分,但它无法判定站在设备前的究竟是一个人还是两个人。这是单机设备与生俱来的能力边界,任何声称能自动强制职责分离的单机应用,都应当被追问一句”它凭什么知道”。
七、结语:把归属的边界一并写进交付物
回到那台工地平板。一天下来,三个人用过它,台账里躺着若干条记录,报告底部盖着设备里存着的那一张签名。这套归属模型能承载什么、不能承载什么,取决于我们是否把两件事分清:记录声明了谁执行、谁放行,这是数据层面的事实;持机者是否等于署名人,这是单机设备给不出答案的问题。
可以把边界这样落下来:
- 能证明的:记录声明了本次的执行者与放行者;报告署名对应设备当前预设的检验员;记录字段与报告落款可分别呈现不同角色。
- 不能证明的:持机者与记录署名人是否同一;签名图像是否由本人施加。
- 不该做的:把设备级共享签名对外称作”逐人可追溯的电子签名”;在报告里把执行者与放行者合并成一个不存在的角色。
多人共用一台设备不是要回避的例外,而是应当被正面写进数据模型与能力声明的常态。端侧离线工具的诚实,最终体现在愿意把归属关系拆到字段与界面这一层,并把”证明过什么、没证明什么”与产品一起交付。
参考文献
[1] Standards Australia. AS/NZS 3760:2022 In-service safety inspection and testing of electrical equipment. https://www.standards.org.au/standards-catalogue/sa-snz/electrotechnology/el-036/as-nz-s-3760-2022 [2] UK Health and Safety Executive. Lifting Operations and Lifting Equipment Regulations 1998 (LOLER). https://www.hse.gov.uk/work-equipment-machinery/loler.htm [3] US Occupational Safety and Health Administration. 29 CFR 1910.184 Slings. https://www.osha.gov/laws-regs/regulations/standardnumber/1910/1910.184 [4] European Union. Regulation (EU) 2016/679 (GDPR), Article 5 — Principles relating to processing of personal data. https://eur-lex.europa.eu/eli/reg/2016/679/oj [5] Apple Developer Documentation. UserDefaults. https://developer.apple.com/documentation/foundation/userdefaults [6] CIPA. DC-008-Translation-2023 Exchangeable image file format for digital still cameras: Exif Version 2.32. https://www.cipa.jp/std/documents/e/DC-X008-Translation-2023-E.pdf [7] ISO/IEC. ISO/IEC 27002:2022 Information security, cybersecurity and privacy protection — Information security controls. https://www.iso.org/standard/75652.html [8] UK Health and Safety Executive. Thorough examination of lifting equipment: A simple guide for employers. https://www.hse.gov.uk/pubns/indg422.pdf [9] NIST. SP 800-88 Rev.1 Guidelines for Media Sanitization. https://csrc.nist.gov/pubs/sp/800/88/r1/final