我用C ++编写了一个支持常规网站的基本HTTP服务器,但我现在正在尝试将其扩展为支持websockets。所有的网络和解析都是由我自己的代码完成的,所以没有库 - 除了我复制并粘贴了一些用于计算SHA1和转换为base64的代码。
我正在阅读几个描述如何握手传入的websocket连接的指南,例如:http://www.altdev.co/2012/01/23/writing-your-own-websocket-server/和http://enterprisewebbook.com/ch8_websockets.html
我被困在服务器需要从客户端头部获取密钥并将魔术字符串附加到其上的部分上,然后使用SHA1对其进行哈希处理,在base64中对其进行编码,并将结果作为接受的一部分发回报头中。
给我带来麻烦的具体部分是密钥中的'==',以及服务器发回的结果字符串中的'='。我找不到任何说明如何处理这些信息的信息 - 在将魔术字符串附加到键之前从键中删除==,还是保持它们?另外,我无法弄清楚最终服务器答案结尾处的'='来自何处 - 以及为什么服务器的答案只有一个'='而客户的密钥有两个'='
最后,我很困惑为什么服务器使用的魔术字符串在base16中,但是客户端浏览器发送的密钥已经是base64 - 我是否需要在附加服务器字符串之前将服务器字符串转换为base 64,或者没关系?
当我转换为base 64时,我是否将其转换为每个ascii符号都是数字(因此字符串中的'A'将为10),或者我将整个字符串的二进制表示转换为字符串代表原始二进制文件但是有base64的数字?
很抱歉,如果这是一个愚蠢的问题,但我没有做太多的网页编程,所以当文章假设读者知道一部分信息时,我会感到困惑。
答案 0 :(得分:2)
伪代码:
key_decoded = base64_decode(key64)
magic = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
response = SHA1(append(key_decoded, magic))
response_encoded = base64_encode(response)
base64编码数据末尾的'='用于将数据填充到所需的长度。你不必用它做任何事情。 (参见这里:Why does a base64 encoded string have an = sign at the end)不同长度的输入数据可能需要不同的填充量,因此在您的示例中,两个编码值具有不同的填充量。
当你转换为base64时,你不会假设输入数据,它只是输入字节。不要将'a'转换为10(你似乎认为ascii字符应该代表十六进制数字,这是无关的)