You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Golang TLS测试:如何使客户端与服务器每次协商相同密钥以固定密文

固定Golang TLS交互密文的测试方案

要让每次测试时客户端与服务器交互的密文完全一致,核心是固定TLS握手及加密过程中的所有动态变量,以下是具体实现步骤:

  • 复用固定TLS会话
    跳过每次测试的密钥协商流程,直接复用预先生成的固定会话,确保加密密钥一致。可以通过自定义ClientSessionCache实现:

    type fixedSessionCache struct {
        session *tls.ClientSessionState
    }
    
    func (c *fixedSessionCache) Get(sessionKey string) (*tls.ClientSessionState, bool) {
        return c.session, true
    }
    
    func (c *fixedSessionCache) Put(sessionKey string, cs *tls.ClientSessionState) {}
    
    // 预先生成一次会话并保存,测试时直接传入缓存
    func createFixedSessionCache() *fixedSessionCache {
        // 可先运行一次测试将会话序列化保存到文件,后续测试读取复用
        return &fixedSessionCache{session: preSavedSession}
    }
    

    客户端配置中指定该缓存:clientConfig.ClientSessionCache = createFixedSessionCache()

  • 固定握手随机数
    TLS握手时的随机数会影响密钥推导(未复用会话时),需替换默认随机源为固定字节序列:

    type fixedRand struct{}
    
    func (r *fixedRand) Read(b []byte) (n int, err error) {
        // 填充固定的32字节序列(满足TLS ClientHello随机数长度要求)
        fixedBytes := []byte{0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
                            0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
                            0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
                            0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20}
        copy(b, fixedBytes)
        return len(fixedBytes), nil
    }
    
    // 给客户端和服务器配置指定固定随机源
    clientConfig.Rand = &fixedRand{}
    serverConfig.Rand = &fixedRand{}
    
  • 固定应用层明文内容
    密文由明文加密生成,必须确保每次测试客户端发送的明文完全一致,避免任何动态内容(如时间戳、随机ID)。

  • 锁定TLS协商参数

    • 禁用会话票证:serverConfig.SessionTicketsDisabled = true,避免动态生成的票证干扰会话复用
    • 指定固定加密套件:clientConfig.CipherSuites = []uint16{tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384},确保每次使用相同加密算法

内容的提问来源于stack exchange,提问作者alexandru.topliceanu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 13:01:18