tea*_* me 3 webserver http websocket
我正在关注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哈希和Base64编码的过程.
"dGhlIHNhbXBsZSBub25jZQ == 258EAFA5-E914-47DA-95CA-C5AB0DC85B11" 的在线SHA1散列给出了正确的结果:"b37a4f2cc0624f1690f64606cf385945b2bec4ea",如rfc6455中所述.
但是对于输入"b37a4f2cc0624f1690f64606cf385945b2bec4ea" ,在线Base64编码给出了错误的结果"YjM3YTRmMmNjMDYyNGYxNjkwZjY0NjA2Y2YzODU5NDViMmJlYzRlYQ ==".结果应为"s3pPLMBiTxaQ9kYGzzhZRbK + xOo ="
我究竟做错了什么?
您需要对原始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())
Run Code Online (Sandbox Code Playgroud)
这打印:
hexdigest: b37a4f2cc0624f1690f64606cf385945b2bec4ea
digest: ?zO,ÀbO?öFÏ8YE??Äê
wrong result: YjM3YTRmMmNjMDYyNGYxNjkwZjY0NjA2Y2YzODU5NDViMmJlYzRlYQ==
right result: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4023 次 |
| 最近记录: |