当前位置: 首页 > 知识库问答 >
问题:

从“Sec WebSocket密钥”生成“Sec WebSocket接受”

阚乐湛
2023-03-14

我下面的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。这个值是
然后基数64编码(见[RFC4648]的第4节),得到值
"s3pPLMBiTxaQ9kYGzzhZRbK xOo="。然后,该值将在|Sec-WebSocket-Access|标头字段中得到响应。

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

为了理解这个过程,我使用了在线SHA1哈希和Base64编码。

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

但是在线Base64 Encode给我错误的结果"YjM3YTRmMmNjMDYyNGYxNjkwZjY0NjA2Y2YzODU5NDViMmJlYzRlYQ=="输入"b37a4f2cc0624f1690f64606cf385945b2bec4ea"。结果应该是"s3pPLMBiTxaQ9kYGzzhZRbK xOo="

我做错了什么?

共有1个答案

钱跃
2023-03-14

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

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

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=
 类似资料:
  • 我正在尝试创建一个公钥以允许我推送到Git,但我的. ssh文件夹尚未创建。 以下是我运行的命令: $ssh-keygen-t rsa-Cemaill@me.com 生成公共/私有rsa密钥对 输入保存密钥的文件(/h/.ssh/id\u rsa): 这就是H:驱动器配置、数据、配置文件、配置文件中的全部内容。V2 我认为有一个问题,因为当我得到提示输入文件,其中保存密钥(/h//. ssh/id

  • 我正在尝试用Java编写一个简单的密码管理器。我想用AES 256位加密用存储的密码加密文件。此外,我希望用户能够解密的文件与密码。当阅读其他在线帖子时,他们几乎都强调简单地使用密码作为密钥是不安全的,他们提到使用随机盐来增加安全性。但我不明白如何在生成密钥时使用随机盐。如果我从用户的密码和随机的salt创建密钥,那么当他们试图解密他们的文件时,我怎么知道salt是什么呢?这让我完全糊涂了。 目前

  • 鉴于: 由RSACryptoServiceProvider生成的签名密钥。 创建带有孩子的签名jwt的需求。 如果签名密钥来自x509证书,那么我会将kid设置为x5t。在这种情况下,情况并非如此。我可以为孩子编造一些武断的东西,但是如果碰撞不太可能发生,并且孩子和证书之间存在有意义的联系,那就最好了。 我的意图是:- 创建一个字节数组,通过将模字节附加到指数字节来创建。 SHA256编码数组。

  • 我希望能够使用openssl在命令行中生成一对私钥和公钥,但我不知道该怎么做。到目前为止,我所做的是在命令行中执行以下操作,但这只打印了我不知道确切的内容:s 来自OPENSSL PAGE:要使用显式参数创建EC参数: 有人能告诉我如何得到这样的东西: 我从网上获得的一个代码中获得了这一点,该代码使用这个密钥对通过ECDSA对消息进行签名,但现在我希望能够生成自己的密钥对(从openssl命令行)

  • 我需要从NSData值生成对称AES密钥,该值创建如下: (initKey是base64字符串值。) 问题是如何从“解码数据”中生成密钥?(类似于Android秘书KeySpec) (我使用的是Swift 2.2) 这里是场景(在Android): 1-我有一个bas64字符串。 2-我将其解码为字节数组。 3-然后根据字节数组长度和AES类型创建secretkey。 4-最后定义一个基于secr

  • 我试图为某些设备生成密钥时出错。我能够在运行4.4.2的三星Galaxy Note上重现错误。 我创建了一个小应用程序,只能通过从Android开发者页面“生成新私钥”下的https://developer.android.com/training/articles/keystore.html逐行复制代码来生成密钥 错误似乎发生在kpg.generateKeyPair(),在Android Key