4. 授权核验的密码学基础
Level2行情接口的授权核验,本质上要回答三个问题:数据是不是由持牌行情源发出的、数据在传输途中是否被篡改、客户端拿到的授权凭证是否真实有效。这三个问题分别对应密码学中的三类基础工具——数字签名、消息认证码(MAC)和哈希算法。它们经常被混为一谈,但在行情授权链路中承担的角色完全不同,选错工具会直接导致安全模型失效。
哈希算法:完整性的“指纹”,但不提供身份证明
哈希算法把任意长度的输入压缩成固定长度的摘要,具有单向性和抗碰撞性。在行情系统中,它最常见的用途是校验行情文件或快照包的完整性。例如交易所每日盘后下发的Level2逐笔委托归档文件,通常会在文件旁附带一个摘要值,客户端下载完成后本地重算并比对:
# 示例:校验行情归档文件完整性(参数为教学示例)
sha256sum L2_ORDER_20240614.dat
# 输出示例:9f2c...e41a L2_ORDER_20240614.dat
# 与官方公布的摘要值逐字符比对,一致则文件未被损坏或截断
关键要理解哈希的边界:摘要一致只能说明“内容没变”,不能说明“内容来自谁”。攻击者完全可以篡改文件后重新计算摘要,再把新摘要一起发给你。因此哈希必须与签名或MAC配合,单独使用只适合防传输损坏,不适合防恶意伪造。行情授权中另一个典型用法是凭证摘要——把授权码、客户号、有效期拼成规范字符串后取哈希,作为凭证的唯一标识存入本地白名单,避免明文存储授权码。
消息认证码:共享密钥下的“防篡改+防伪造”
MAC(常用HMAC-SHA256)使用双方共享的密钥对消息计算认证标签。行情推送场景中,服务端对每条行情消息或每个批次计算HMAC,客户端用同一密钥验证。由于密钥不公开,攻击者既改不了内容,也伪造不出标签。它比哈希多了一层“身份”保证,但这个身份是“持有密钥的一方”,而不是某个具体主体。
MAC的致命弱点是密钥对称:服务端和所有客户端持有同一把密钥,任何一个客户端泄露密钥,整个体系的防伪造能力就崩塌,而且服务端无法向第三方证明“这条消息确实是我发的”——因为客户端自己也能算出同样的标签。所以MAC适合点对点的专线推送、内部网关之间的行情转发,不适合需要向监管或第三方举证的公网授权场景。工程上还要注意:HMAC的密钥必须通过带外渠道分发,绝不能和行情数据走同一通道;每条消息应带单调递增序号或时间戳参与计算,防止重放攻击。
数字签名:不可否认的授权凭证
数字签名用私钥签名、公钥验签,解决了MAC无法解决的不可否认问题。行情授权中最典型的应用是授权令牌(License Token):行情源用私钥对“客户号+授权数据类型(Level2逐笔/快照)+有效期+接口权限位”的规范串签名,客户端内置或动态获取公钥验签。验签通过且有效期未过,才允许建立Level2行情连接。
下面这张图展示了一条Level2行情消息从签发到客户端验签的完整密码学链路,以及三类工具各自介入的位置:
三者如何组合成可执行的核验流程
实际工程中很少只用一种工具。一个可落地的Level2授权核验流程通常分两层:授权层用数字签名验证令牌,确认“这个客户有权订阅Level2逐笔数据、有效期到某日”;数据层用HMAC验证每个行情批次,确认“这批数据在传输中没被改、没被重放”。哈希则作为两层的内部构件——签名前先对声明串取摘要再签,既缩短签名长度,也固定了被签内容的规范形式。
这里有一个容易被忽略的工程细节:规范串的构造必须唯一确定。如果签名方按“客户号|权限位|有效期”拼接,验签方却按“客户号|有效期|权限位”拼接,摘要必然不同,验签失败。因此协议文档必须明确规定字段顺序、分隔符、编码(建议UTF-8)、时间格式(如Unix秒)和空值处理方式。教学示例中可约定:
# 授权声明规范串(示例约定)
canonical = client_id + "|" + perm_bits + "|" + expire_unix
# 例:A1024|L2_ORDER,L2_TRADE|1718409600
digest = SHA256(canonical)
token = base64( digest || RSA_PKCS1_v1_5_sign(digest, private_key) )
客户端验签时先解出摘要与签名,用公钥对摘要验签,再本地重算canonical的SHA256并比对,两者都通过才认为令牌有效。注意验签只证明令牌由持私钥方签发,不证明令牌未被复制——所以令牌还应绑定设备指纹或会话随机数,并配合服务端的连接数控制,防止一个合法令牌被多客户端共用。
选型判断:什么场景用哪个
可以用一条简单的判断线来选型:需要向第三方证明“是谁发的”,用数字签名;只需要双方确认“没被改且来自持密钥方”,用MAC;只需要确认“内容完整”,用哈希。行情授权中,授权令牌面向客户和监管,必须用签名;行情推送批次面向已认证的会话,用MAC更轻量;归档文件校验用哈希最经济。三者不是替代关系,而是分层协作关系,任何一层缺失都会在对应维度上留下攻击面。