通过存储与Wireshark

时间:2017-11-24 16:12:48

标签: ssl go wireshark tls1.2 nss

我正在尝试通过提供包含tls.Config字段的Rand结构来建立TLS连接,该字段在调用int方法时应始终返回相同的Read,cf 。这里的文档:https://golang.org/pkg/crypto/tls/#Config

我写过这个建设者:

func newZeroRand() *rand.Rand {
    return rand.New(rand.NewSource(0))
}

在多次调用rand.Rand时,确保int始终返回相同Read的测试,请注意不同的输入参数"foo"和{{1提供相同的输出:

"bar"

使用之前定义的func TestPredictableZeroRandGenerator(t *testing.T) { zeroRand := newZeroRand() firstNum, err := zeroRand.Read([]byte("foo")) if err != nil { t.Error(err) } secondNum, err := zeroRand.Read([]byte("bar")) if err != nil { t.Error(err) } // fmt.Printf("firstNum %d secondNum %d \n", firstNum, secondNum) if firstNum != secondNum { t.Error(fmt.Sprintf("This is not a predictable zero random generator! The first number is: %d the second number is: %d", firstNum, secondNum)) } } 我希望在提供如下TLS配置时始终在文件newZeroRand()内生成相同的SSL密钥:

same-key.log

但是对于多次执行,我得到不同的文件内容。我可能误解了这里的详细信息:https://golang.org/pkg/crypto/tls/#example_Config_keyLogWriter因为我在每次执行后打开这些文件func tlsConfig() (*tls.Config, error) { w, err := os.OpenFile("same-key.log", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0755) if err != nil { return nil, err } tlsConfig := tls.Config{ Rand: newZeroRand(), KeyLogWriter: w, } return &tlsConfig, nil } 然后我在Mozilla的NSS密钥日志格式中找到了这里描述的结构:https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS/Key_Log_Format

same-key.log

其中:

  • CLIENT_RANDOM <FIRST_LONG_ID> <SECOND_LONG_ID> 始终相同
  • <FIRST_LONG_ID>每次执行后都会发生变化&lt; - 为什么会发生这种情况?

为来自不同执行的一批数据包提供密钥文件<SECOND_LONG_ID>时, Wireshark无法删除它们!

我可能在这里误解了一些关于SSL加密的内部问题,我想知道是否还应该在配置结构中提供证书?我怎么能生成这些证书?

Afaik在密钥顶部使用证书时,应该有一条信息在运行时来自另一方,因此如果我没有这些信息,我就无法解密数据包流。这就是为什么我认为如果我想使用Wireshark解密这些数据包就不需要证书。

否则我不确定如何强制TCP连接始终使用相同的密钥加密/解密数据包?

修改

正如@peter在他的回答中指出的那样,我在输入字节片的长度而不是实际的“确定性随机值”上断言。

我推出了same-key.log结构的Read实现:

tls.Config

这是设置为type debugRand struct {} func (dr *debugRand) Read(p []byte) (n int, err error) { for i := range p { p[i] = byte(0) } return len(p), nil } func newZeroRand() *debugRand { return &debugRand{} } 输入切片的所有元素。

但是,我仍会生成SSL密钥,这些密钥对于不同的执行具有不同的0值。

在分析这些加密的TCP数据包时,是否有可能让Wireshark在不同的TLS连接上重新使用SSL密钥

1 个答案:

答案 0 :(得分:1)

您使用的是Read错误。您的测试不会测试您的想法。 firstNum和secondNum都是3,因为你正在读三个随机字节;因为你传递长度为3的字节切片。你永远不会检查实际的随机字节。