新闻详情
【字节跳动】# 加密盐值与私有通信协议规范白皮书
【字节跳动】# 加密盐值与私有通信协议规范白皮书
加密盐值与私有通信协议规范白皮书文档版本V1.0密级内部机密禁止对外分发、逆向、日志明文输出适用范围用户数据签名、内网/端服务私有加密通信、身份校验、防篡改防重放体系生效日期2026-06-20目录术语与定义加密盐值分层规范私有加密核心参数清单与保密分级用户数据签名标准流程端-服务私有通信加密规范二进制数据包协议结构定义生成、存储、传输安全约束攻击防护机制密钥/盐轮换与故障处置流程运维审计与合规要求标准实现伪代码参考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 盐编码统一标准原始二进制仅用于内存加密计算持久化/传输统一使用Base64-URL无填充编码禁止使用标准Base64含/字符避免URL、二进制协议解析冲突解码规则编码字符串尾部自动补还原原始字节流2.3 各类盐使用边界约束全局根盐仅参与密钥派生、底层签名混淆不单独下发任何客户端禁止打印至运行日志、监控指标、异常堆栈、dump文件用户静态盐一对一绑定用户UID每个用户唯一不复用仅用于该用户数据签名、用户凭证哈希计算不跨用户复用会话临时盐每一条加密数据包独立生成不重复使用仅作用于单次通信加密不参与持久化签名校验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 ByteSIGN_EXPIRE_SEC签名时间戳有效期300秒5分钟3.3 公开协议字段可客户端传输协议版本号、数据包总长度、设备脱敏ID、时间戳、加密算法标识不含任何盐、私有密钥、掩码常量。4. 用户数据签名标准流程4.1 签名源数据固定拼接规则sign_source 原始业务二进制数据 用户静态盐(二进制) SIGN_SUFFIX_SALT(二级私有常量) PROTO_ROOT_SALT(一级根盐) 时间戳8字节大端编码4.2 签名计算步骤拼接完整sign_source字节流使用一级机密 HMAC_SIGN_PRIVATE_KEY 作为密钥哈希算法 HMAC-SHA256 计算摘要摘要结果做Base64-URL无填充编码作为最终签名串校验端重复相同拼接逻辑复算签名完全匹配则数据合法。4.3 签名校验拦截规则签名字符串长度不匹配 → 直接丢弃数据包记录可疑访问日志时间戳超出 ±300秒 窗口 → 判定重放攻击拒绝处理复算签名与传输签名不一致 → 拦截标记设备风险用户盐不存在/已过期 → 返回凭证失效要求重新登录。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 加密/附加数据规则TMP_SALT 加密存放于协议私有密文段不裸漏传输GCM模式IV随机12字节每包独立生成附加校验AD数据包含协议版本、时间戳、脱敏设备ID密文末尾附加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 盐值生成强制要求禁止使用rand()、random()等伪随机函数统一调用操作系统内核CSPRNG接口/dev/urandom / CryptGenRandom / SecureRandom生成后内存禁止缓存使用完毕立即覆盖清零。7.2 持久化存储规范全局根盐、HMAC私钥存储于加密配置中心数据库使用国密SM4二次加密落地用户静态盐用户业务库字段加密存储不允许明文入库、导出禁止盐值写入配置文件、容器环境变量明文、前端静态资源。7.3 传输约束一级机密参数禁止跨网络传输仅本地内存读取用户盐仅服务端内部DB读取不下发客户端仅会话临时盐允许加密后随数据包传输全链路通信底层强制TLS 1.3私有协议仅在内层业务加密。8. 攻击防护机制防彩虹表每个用户独立32Byte静态盐无空盐、通用盐场景防重放时间戳窗口单次会话盐双重校验盐不可复用防逆向破解全局根盐协议掩码双层混淆客户端无核心常量逆向无法完整还原加密链路防批量撞库根盐全局隔离单用户盐泄露无法推导其他用户签名防中间人篡改GCM校验Tag HMAC双层签名校验任意字节修改直接校验失败防日志泄露所有加密参数输出前自动脱敏日志仅打印哈希摘要。9. 密钥/盐轮换与故障处置流程9.1 定期轮换策略全局根盐 ROOT_SALT每年强制轮换双根盐并行校验30天过渡期HMAC签名私钥每180天轮换灰度分批发布用户静态盐用户重置密码、更换设备、账号安全校验通过后自动重生成。9.2 泄露应急处置用户静态盐单条泄露强制该用户下线重新生成USER_SALT失效全部历史签名二级私有参数泄露当日完成配置中心参数重生成滚动重启内网服务一级机密ROOT_SALT/HMAC私钥泄露全量下线所有业务节点重新生成全套一级机密30天双密钥兼容校验全用户触发凭证刷新批量轮换用户静态盐。10. 运维审计与合规要求10.1 操作审计读取一级机密参数、修改盐/密钥配置记录操作人、内网IP、操作时间、变更内容哈希审计日志不可删除采用WORM只读存储留存不少于365天。10.2 权限管控密钥配置中心最小权限模型双人复核变更开发、测试环境不允许使用生产级ROOT_SALT独立隔离测试盐池。10.3 合规红线禁止将本规范、私有盐、密钥交付第三方、外包、外部审计禁止客户端二进制内置任何一级、二级私有参数禁止明文导出用户盐、加密配置数据库备份。11. 标准实现伪代码生产参考11.1 用户静态盐生成importos,base64defgenerate_user_salt()-str:rawos.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_saltbase64.urlsafe_b64decode(user_salt_b64)# 固定拼接顺序sign_srcraw_datauser_saltSIGN_SUFFIX_SALTPROTO_ROOT_SALTts_8byte# HMAC签名hhmac.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:kdfPBKDF2HMAC(saltPROTO_ROOT_SALT,iterationsPBKDF2_ITER_COUNT,length32,hash_algorithmhashes.SHA256())returnkdf.derive(session_secret)11.4 签名校验入口defverify_sign(raw_data:bytes,user_salt_b64:str,ts_8byte:bytes,client_sign:str)-bool:local_signcalculate_signature(raw_data,user_salt_b64,ts_8byte)# 恒定时间比对防时序攻击returnhmac.compare_digest(local_sign.encode(),client_sign.encode())