生成" Sec-WebSocket-Accept"来自" Sec-WebSocket-Key"

时间:2016-03-14 00:59:52

标签: http websocket webserver

我跟随rfc6455

  

具体地说,如果如上例所示,那么| Sec-WebSocket-Key |
  标题字段的值为" dGhlIHNhbXBsZSBub25jZQ ==",服务器
  会连接字符串" 258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
  形成字符串" dGhlIHNhbXBsZSBub25jZQ == 258EAFA5-E914-47DA-95CA-
  C5AB0DC85B11&#34 ;.然后服务器将获取此的SHA-1哈希值   给出值0xb3 0x7a 0x4f 0x2c 0xc0 0x62 0x4f 0x16 0x90 0xf6
  0x46 0x06 0xcf 0x38 0x59 0x45 0xb2 0xbe 0xc4 0xea。该值为
  然后base64编码(参见[RFC4648]的第4节),给出值
  " s3pPLMBiTxaQ9kYGzzhZRbK + XOO =&#34 ;.然后该值将在回显中   | Sec-WebSocket-Accept |标题字段。

并且无法生成正确的" Sec-WebSocket-Accept"。

为了理解我使用在线SHA1 hashBase64 Encode的流程。

online SHA1 hash for" dGhlIHNhbXBsZSBub25jZQ == 258EAFA5-E914-47DA-95CA-C5AB0DC85B11"给出正确的结果:" b37a4f2cc0624f1690f64606cf385945b2bec4ea"如rfc6455中所述。

但是online Base64 Encode给了我错误的结果" YjM3YTRmMmNjMDYyNGYxNjkwZjY0NjA2Y2YzODU5NDViMmJlYzRlYQ =="输入" b37a4f2cc0624f1690f64606cf385945b2bec4ea"。 结果应为" s3pPLMBiTxaQ9kYGzzhZRbK + xOo ="

我做错了什么?

1 个答案:

答案 0 :(得分:5)

您需要对原始sha1摘要进行base64编码 您正在编码摘要的十六进制字符串表示形式,它是长度的两倍。

在线工具使用文本而不能处理原始二进制数据,这就是您得到错误结果的原因。

Python示例:

import hashlib, base64
h = hashlib.sha1("dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11")
print "hexdigest:", h.hexdigest() # hexadecimal string representation of the digest
print "digest:", h.digest() # raw binary digest
print
print "wrong result:", base64.b64encode(h.hexdigest())
print "right result:", base64.b64encode(h.digest())

打印:

hexdigest: b37a4f2cc0624f1690f64606cf385945b2bec4ea
digest: ᄈzO,ÀbOミöFÏ8YEᄇᄒÄê

wrong result: YjM3YTRmMmNjMDYyNGYxNjkwZjY0NjA2Y2YzODU5NDViMmJlYzRlYQ==
right result: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=