【问题标题】:generate "Sec-WebSocket-Accept" from "Sec-WebSocket-Key"从“Sec-WebSocket-Key”生成“Sec-WebSocket-Accept”
【发布时间】:2016-06-28 22:09:39
【问题描述】:

我正在关注rfc6455

具体来说,如上例所示,|Sec-WebSocket-Key|
标头字段的值为“dGhlIHNhbXBsZSBub25jZQ==”,服务器
将连接字符串“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”
形成字符串“dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-
C5AB0DC85B11"。然后,服务器将采用 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=”。然后这个值会在
中回显 |Sec-WebSocket-Accept|头域。

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

为了了解我在网上使用SHA1 hashBase64 Encode的过程。

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

但是online Base64 Encode 给我错误的结果“YjM3YTRmMmNjMDYyNGYxNjkwZjY0NjA2Y2YzODU5NDViMmJlYzRlYQ==”对于输入“b37a4f2cc0624f1690f64606cf385945b2bec4ea”。 结果应该是“s3pPLMBiTxaQ9kYGzzhZRbK+xOo="

我做错了什么?

【问题讨论】:

    标签: http websocket webserver


    【解决方案1】:

    您需要对原始 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=
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-18
      • 2016-04-19
      • 2017-03-04
      相关资源
      最近更新 更多