首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从"Sec-WebSocket-Key“生成"Sec-WebSocket-Accept”

从"Sec-WebSocket-Key“生成"Sec-WebSocket-Accept”
EN

Stack Overflow用户
提问于 2016-03-14 00:59:51
回答 1查看 8.1K关注 0票数 7

我在跟踪rfc6455

具体而言,如果如上面的示例所示,则是\Sec-WebSocket-Key= 标头字段的值为"dGhlIHNhbXBsZSBub25jZQ==",服务器 将字符串"258EAFA5-E914-47DA-95CA-C5AB0DC85B11“连接起来 以形成字符串"dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA- 然后服务器将接受SHA-1散列, 给出0xb3 0x7a 0x4f 0x2c 0xc0 x62 0x4f 0x16 0x90 0xf6的值。 0x46 0x06 0xcf 0x38 0x59 0x45 0xb2 0xbe 0xc4 0xea。这个值是 然后将base64 64编码(参见RFC4648第4节),以给出值 "s3pPLMBiTxaQ9kYGzzhZRbK+xOo=“。然后,这个值将被回溯到 Sec-WebSocket-Accept\ header字段。

而无法生成正确的"Sec-WebSocket-Accept“。

为了理解这个过程,我使用了在线SHA1散列Base64编码

"dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11“的联机SHA1散列给出了正确的结果: rfc6455中描述的"b37a4f2cc0624f1690f64606cf385945b2bec4ea”。

但是,"YjM3YTRmMmNjMDYyNGYxNjkwZjY0NjA2Y2YzODU5NDViMmJlYzRlYQ==“输入"b37a4f2cc0624f1690f64606cf385945b2bec4ea”时,联机Base64编码给了我错误的结果。结果应该是"s3pPLMBiTxaQ9kYGzzhZRbK+xOo=“

我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-14 14:14:53

您需要对原始sha1摘要进行base64 64编码。

您正在编码摘要的十六进制字符串表示形式,它是长度的两倍。

在线工具处理文本,而不处理原始二进制数据,这就是为什么您得到了错误的结果。

Python 2示例:

代码语言:javascript
复制
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())

这些指纹:

代码语言:javascript
复制
hexdigest: b37a4f2cc0624f1690f64606cf385945b2bec4ea
digest: ᄈzO,ÀbOミöFÏ8YEᄇᄒÄê

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

Python 3示例:

代码语言:javascript
复制
import hashlib, base64
h = hashlib.sha1(b"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().encode()).decode())
print("right result:", base64.b64encode(h.digest()).decode())

这些指纹:

代码语言:javascript
复制
hexdigest: b37a4f2cc0624f1690f64606cf385945b2bec4ea
digest: b'\xb3zO,\xc0bO\x16\x90\xf6F\x06\xcf8YE\xb2\xbe\xc4\xea'

wrong result: YjM3YTRmMmNjMDYyNGYxNjkwZjY0NjA2Y2YzODU5NDViMmJlYzRlYQ==
right result: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35977916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档