【字节跳动】# 加密盐值与私有通信协议规范白皮书

【字节跳动】# 加密盐值与私有通信协议规范白皮书

加密盐值与私有通信协议规范白皮书

文档版本:V1.0
密级:内部机密|禁止对外分发、逆向、日志明文输出
适用范围:用户数据签名、内网/端服务私有加密通信、身份校验、防篡改防重放体系
生效日期:2026-06-20

目录

  1. 术语与定义
  2. 加密盐值分层规范
  3. 私有加密核心参数清单与保密分级
  4. 用户数据签名标准流程
  5. 端-服务私有通信加密规范
  6. 二进制数据包协议结构定义
  7. 生成、存储、传输安全约束
  8. 攻击防护机制
  9. 密钥/盐轮换与故障处置流程
  10. 运维审计与合规要求
  11. 标准实现伪代码参考

1. 术语与定义

1.1 加密盐(Salt)
附加于明文、密钥、签名原文的高熵随机字节串,用于消除相同原文哈希碰撞、抵御彩虹表撞库攻击,分为全局根盐、用户静态盐、会话临时盐三类。
1.2 私有协议参数
仅内部可信服务持有、不对外公开的加密常量、派生系数、混淆掩码、签名密钥、魔数偏移值,是私有加密链路核心机密。
1.3 可信节点
内网加密网关、签名服务、密钥配置中心、核心业务服务;移动端、Web前端、第三方客户端不属于可信节点,不允许持有高等级私有参数。
1.4 KDF 密钥派生函数
PBKDF2-HMAC-SHA256,基于盐与原始密钥迭代派生高强度对称加密主密钥。
1.5 数据签名
HMAC-SHA256,基于私有签名密钥+多层盐混合原文计算摘要,用于数据防篡改、身份合法性校验。

2. 加密盐值分层规范

2.1 层级划分与熵标准

盐类型字节长度生成源存储位置生命周期保密等级
全局根盐 ROOT_SALT64 ByteCSPRNG 内核安全随机可信服务加密配置中心,禁止客户端下发长期有效,年度强制轮换一级机密(最高)
用户静态盐 USER_SALT32 ByteCSPRNG用户数据库加密字段,二次库内加密存储用户账号生命周期,重置凭证/换设备强制重生成二级机密
会话临时盐 TMP_SALT16 Byte单次握手随机生成单次数据包密文头部加密传输单次会话,连接销毁立即失效三级内部参数

2.2 盐编码统一标准

  1. 原始二进制仅用于内存加密计算;持久化/传输统一使用Base64-URL无填充编码
  2. 禁止使用标准Base64(含+/=字符),避免URL、二进制协议解析冲突
  3. 解码规则:编码字符串尾部自动补==还原原始字节流

2.3 各类盐使用边界约束

  1. 全局根盐
    • 仅参与密钥派生、底层签名混淆;不单独下发任何客户端
    • 禁止打印至运行日志、监控指标、异常堆栈、dump文件
  2. 用户静态盐
    • 一对一绑定用户UID,每个用户唯一,不复用
    • 仅用于该用户数据签名、用户凭证哈希计算,不跨用户复用
  3. 会话临时盐
    • 每一条加密数据包独立生成,不重复使用
    • 仅作用于单次通信加密,不参与持久化签名校验

3. 私有加密核心参数清单与保密分级

3.1 一级机密(仅密钥中心+签名服务可读)

参数常量名用途固定配置标准
PROTO_ROOT_SALT全局底层混淆盐,KDF基础盐64字节密码学随机串
HMAC_SIGN_PRIVATE_KEY签名主密钥,所有业务签名基础密钥32字节安全随机密钥
AES_GLOBAL_XOR_MASK协议头二进制混淆掩码16字节异或常量

3.2 二级内部配置参数(全内网服务可见,禁止对外暴露)

参数常量名用途固定配置标准
PBKDF2_ITER_COUNT密钥派生迭代次数100000次
SIGN_SUFFIX_SALT签名后置附加子盐16字节固定常量
MAGIC_OFFSET_MASK协议魔数偏移修正值4字节无符号整数
TMP_SALT_FIX_LEN会话盐固定长度16 Byte
SIGN_EXPIRE_SEC签名时间戳有效期300秒(5分钟)

3.3 公开协议字段(可客户端传输)

协议版本号、数据包总长度、设备脱敏ID、时间戳、加密算法标识;不含任何盐、私有密钥、掩码常量。

4. 用户数据签名标准流程

4.1 签名源数据固定拼接规则

sign_source = 原始业务二进制数据 + 用户静态盐(二进制) + SIGN_SUFFIX_SALT(二级私有常量) + PROTO_ROOT_SALT(一级根盐) + 时间戳8字节大端编码

4.2 签名计算步骤

  1. 拼接完整sign_source字节流;
  2. 使用一级机密 HMAC_SIGN_PRIVATE_KEY 作为密钥;
  3. 哈希算法 HMAC-SHA256 计算摘要;
  4. 摘要结果做Base64-URL无填充编码,作为最终签名串;
  5. 校验端重复相同拼接逻辑复算签名,完全匹配则数据合法。

4.3 签名校验拦截规则

  1. 签名字符串长度不匹配 → 直接丢弃数据包,记录可疑访问日志;
  2. 时间戳超出 ±300秒 窗口 → 判定重放攻击,拒绝处理;
  3. 复算签名与传输签名不一致 → 拦截,标记设备风险;
  4. 用户盐不存在/已过期 → 返回凭证失效,要求重新登录。

5. 端-服务私有通信加密规范

采用 AES-GCM-256 对称加密,密钥由PBKDF2派生,全程依赖分层盐做密钥混淆。

5.1 主密钥派生公式

master_aes_key = PBKDF2HMAC( password = 设备会话临时密钥, salt = PROTO_ROOT_SALT, iterations = PBKDF2_ITER_COUNT, hash = SHA256, output_length = 32 Byte )

5.2 单包会话子密钥生成

session_sub_key = HMAC-SHA256(master_aes_key, TMP_SALT)

5.3 加密/附加数据规则

  1. TMP_SALT 加密存放于协议私有密文段,不裸漏传输;
  2. GCM模式IV随机12字节每包独立生成;
  3. 附加校验AD数据包含协议版本、时间戳、脱敏设备ID;
  4. 密文末尾附加GCM校验Tag,防篡改。

6. 二进制数据包协议结构定义

整体包分为【公开明文头部段】+【加密私有段】,头部可解析,私有段必须解密后读取。

6.1 明文头部(固定24字节)

偏移长度字段说明
0x004BMagic原始值基础魔数,需异或 MAGIC_OFFSET_MASK 还原
0x042BProtocol Ver协议版本,当前0x0100(V1.0)
0x068BTimestamp大端uint64 时间戳
0x0E4BTotal Packet Len整包字节长度
0x124BDevice Hash ID设备ID哈希脱敏值

6.2 加密私有段(AES-GCM密文)

解密后内部结构:

偏移长度字段
0x0016BTMP_SALT 会话临时盐
0x10可变业务原始数据
尾部32BHMAC数据签名值

7. 生成、存储、传输安全约束

7.1 盐值生成强制要求

  1. 禁止使用rand()random()等伪随机函数;
  2. 统一调用操作系统内核CSPRNG接口:/dev/urandom / CryptGenRandom / SecureRandom;
  3. 生成后内存禁止缓存,使用完毕立即覆盖清零。

7.2 持久化存储规范

  1. 全局根盐、HMAC私钥:存储于加密配置中心,数据库使用国密SM4二次加密落地;
  2. 用户静态盐:用户业务库字段加密存储,不允许明文入库、导出;
  3. 禁止盐值写入配置文件、容器环境变量明文、前端静态资源。

7.3 传输约束

  1. 一级机密参数禁止跨网络传输,仅本地内存读取;
  2. 用户盐仅服务端内部DB读取,不下发客户端;
  3. 仅会话临时盐允许加密后随数据包传输;
  4. 全链路通信底层强制TLS 1.3,私有协议仅在内层业务加密。

8. 攻击防护机制

  1. 防彩虹表:每个用户独立32Byte静态盐,无空盐、通用盐场景;
  2. 防重放:时间戳窗口+单次会话盐双重校验,盐不可复用;
  3. 防逆向破解:全局根盐+协议掩码双层混淆,客户端无核心常量,逆向无法完整还原加密链路;
  4. 防批量撞库:根盐全局隔离,单用户盐泄露无法推导其他用户签名;
  5. 防中间人篡改:GCM校验Tag + HMAC双层签名校验,任意字节修改直接校验失败;
  6. 防日志泄露:所有加密参数输出前自动脱敏,日志仅打印哈希摘要。

9. 密钥/盐轮换与故障处置流程

9.1 定期轮换策略

  1. 全局根盐 ROOT_SALT:每年强制轮换,双根盐并行校验30天过渡期;
  2. HMAC签名私钥:每180天轮换,灰度分批发布;
  3. 用户静态盐:用户重置密码、更换设备、账号安全校验通过后自动重生成。

9.2 泄露应急处置

  1. 用户静态盐单条泄露:强制该用户下线,重新生成USER_SALT,失效全部历史签名;
  2. 二级私有参数泄露:当日完成配置中心参数重生成,滚动重启内网服务;
  3. 一级机密(ROOT_SALT/HMAC私钥)泄露:
    • 全量下线所有业务节点;
    • 重新生成全套一级机密;
    • 30天双密钥兼容校验;
    • 全用户触发凭证刷新,批量轮换用户静态盐。

10. 运维审计与合规要求

10.1 操作审计

  • 读取一级机密参数、修改盐/密钥配置,记录操作人、内网IP、操作时间、变更内容哈希;
  • 审计日志不可删除,采用WORM只读存储留存不少于365天。
    10.2 权限管控
  • 密钥配置中心最小权限模型,双人复核变更;
  • 开发、测试环境不允许使用生产级ROOT_SALT,独立隔离测试盐池。
    10.3 合规红线
  • 禁止将本规范、私有盐、密钥交付第三方、外包、外部审计;
  • 禁止客户端二进制内置任何一级、二级私有参数;
  • 禁止明文导出用户盐、加密配置数据库备份。

11. 标准实现伪代码(生产参考)

11.1 用户静态盐生成

importos,base64defgenerate_user_salt()->str:raw=os.urandom(32)returnbase64.urlsafe_b64encode(raw).rstrip(b"=").decode("utf-8")

11.2 数据签名计算函数

importhmac,hashlibfromconfigimportPROTO_ROOT_SALT,HMAC_SIGN_PRIVATE_KEY,SIGN_SUFFIX_SALTdefcalculate_signature(raw_data:bytes,user_salt_b64:str,ts_8byte:bytes)->str:# 解码用户盐user_salt=base64.urlsafe_b64decode(user_salt_b64+"==")# 固定拼接顺序sign_src=raw_data+user_salt+SIGN_SUFFIX_SALT+PROTO_ROOT_SALT+ts_8byte# HMAC签名h=hmac.new(HMAC_SIGN_PRIVATE_KEY,sign_src,hashlib.sha256)returnbase64.urlsafe_b64encode(h.digest()).rstrip(b"=").decode()

11.3 AES主密钥派生

fromcryptography.hazmat.primitives.kdf.pbkdf2importPBKDF2HMACfromcryptography.hazmat.primitivesimporthashesfromconfigimportPROTO_ROOT_SALT,PBKDF2_ITER_COUNTdefderive_aes_master_key(session_secret:bytes)->bytes:kdf=PBKDF2HMAC(salt=PROTO_ROOT_SALT,iterations=PBKDF2_ITER_COUNT,length=32,hash_algorithm=hashes.SHA256())returnkdf.derive(session_secret)

11.4 签名校验入口

defverify_sign(raw_data:bytes,user_salt_b64:str,ts_8byte:bytes,client_sign:str)->bool:local_sign=calculate_signature(raw_data,user_salt_b64,ts_8byte)# 恒定时间比对,防时序攻击returnhmac.compare_digest(local_sign.encode(),client_sign.encode())