【发布时间】:2019-05-09 13:34:15
【问题描述】:
我正在编写一个 TCP 套接字服务器应用程序来接受来自 Angular 应用程序的数据。在服务器应用程序中,我想向 web-socket 请求返回响应标头,但是在生成哈希的 base64 时,我得到的值很长(并且不正确),因此握手失败。
我正在使用System.NetEncoding 单元中的TNetCoding 类进行编码。一个例子可以在https://flixengineering.com/archives/270找到。
我得到了类似的东西:
YWRiYzRlYmJiMDkyZmM2MzNjMGJjMGZjNGY0YjQwOTllZjVhNWMxMw==
procedure TServerForm.SendHeader(key: string);
var
hash, ret, encod: string;
const
magic = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11';
begin
hash := trim(key) + magic;
ret := GenStrHashSHA1(hash);
encod := TNetEncoding.Base64.Encode(ret);
CliSocket.SendStr('HTTP/1.1 101 Switching Protocols' + #13#10 +
'Upgrade: websocket' + #13#10 +
'Connection: Upgrade' + #13#10 +
'Sec-WebSocket-Accept: ' + encod + #13#10 + #13#10);
Memo2.Lines.Add('Header was sent');
end;
/* Hash Function */
function TServerForm.GenStrHashSHA1(Str: String): String;
var
HashSHA: THashSHA1;
begin
HashSHA := THashSHA1.Create;
HashSHA.GetHashString(Str);
result := HashSHA.GetHashString(Str);
end;
例如:
传入请求:
GET / HTTP/1.1
Host: localhost:12345
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Origin: http://localhost:4200
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Sec-WebSocket-Key: ky8at6EtBZLocDhJU7hMnw==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
哈希生成:
c289980eb715b3e19107152dc21f075c9f7bf539
Base64 字符串生成:
YzI4OTk4MGViNzE1YjNlMTkxMDcxNTJkYzIxZjA3NWM5ZjdiZjUzOQ==
更新:这是另一个例子:
收到 WebSocket 密钥:
Nk1L3oS2Q7LHdoGP2Uyn7Q==
调试时显示的十进制值:
生成的字符串:
F68FCEE74F044B57E9047395B975A31A6ABEBDD2
【问题讨论】:
-
您能否提供一个minimal reproducible example,其中包含输入哈希、生成base64 的代码、生成的base64 以及您认为正确的base64。
-
你为什么要给
HashSHA.GetHashString(Str)打两次电话? -
base64的长度是正确的。根据WebSocket protocol spec,SHA1 哈希的结果是 20 个字节,而您显示的 base64 解码为 20 个字节。所以这不是问题。如果您得到错误的哈希结果,那么您一开始就对错误的数据进行哈希处理。确保您散列的
key与客户端的Sec-WebSocket-Key完全匹配(不要解码,不要修剪等) -
对哈希函数的额外调用是疏忽。
-
得到的 base64 是 YWRiYzRlYmJiMDkyZmM2MzNjMGJjMGZjNGY0YjQwOTllZjVhNWMxMw== 我正在查看在 developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/… 找到的信息
标签: delphi delphi-xe2