我正在尝试通过提供包含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密钥 ?
答案 0 :(得分:1)
您使用的是Read错误。您的测试不会测试您的想法。 firstNum和secondNum都是3,因为你正在读三个随机字节;因为你传递长度为3的字节切片。你永远不会检查实际的随机字节。