javascript - 如何让我的服务器返回正确的 Sec-WebSocket-Accept 标头值?
问题描述
通过我的 webSocket 给定密钥,我似乎得到了错误的哈希值。据我所知,套接字的客户端工作正常,因为当我让它连接到其他服务器时,它就成功了。
index.js
const http = require('http')
const cryp=require('crypto')
const port = 8080
var ourHTML=require('fs').readFile("index.html",(err,data) => {
if(err) throw err;
ourHTML = data.toString();
});
const requestHandler = (request, response) => {
//console.log(request)
response.end(ourHTML)
}
const server = http.createServer(requestHandler)
server.on('upgrade',(req,socket)=>{
if(req.headers['upgrade'] !== 'websocket'){
socket.end('HTTP/1.1 400 Bad Request');
return;
}
const hash=getAVal(req.headers['sec-websocket-key']);
console.log(hash);
socket.write([
"HTTP/1.1 101 Web Socket Protocol Handshake",
"Upgrade: WebSocket",
"Connection: Upgrade",
`Sec-WebSocket-Accept: ${hash}`
].join('\r\n')+'\r\n\r\n');
//socket.end();
});
function getAVal(key){
console.log(key);
return cryp
.createHash('sha1')
.update(key+'258EAFA5-E914–47DA-95CA-C5AB0DC85B11', 'binary')
.digest('base64');
}
server.listen(port, (err) => {
if(err){
return console.log("Uhh ohh, "+err.stack,err)
}
console.log("server listening at "+port)
})
索引.html
<html>
<head><title>Local Server</title></head>
<body><h1>Local Server Body</h1><p id="p">To Change</p></body>
<script>
console.log("here");
var ws=new WebSocket("ws://10.0.0.150:8080");
//var ws=new WebSocket("wss://echo.websocket.org");
setInterval(req,1000);
function req(){
ws.send("tickReq");
}
ws.addEventListener('open', () => {
ws.send("Hello");
});
ws.addEventListener('message', event => {
document.getElementById("p").innerHTML=event.data;
});
</script>
</html>
运行时密钥和哈希对的示例是:
PxsrStN1CGLK/JBYydUFjg==
QAK+TE6u+sV705GI+LpP4yKM04Y=
顶部是浏览器给出的键,底部是 getAVal 函数返回的内容,它不正确导致此消息。
WebSocket 握手期间出错:“Sec-WebSocket-Accept”标头值不正确
解决方案
在您的示例中,base64 字符串
"QAK+TE6u+sV705GI+LpP4yKM04Y="
解码为字节
4002BE4C4EAEFAC57BD39188F8BA4FE3228CD386
但是,字符串的正确 SHA1 哈希
"PxsrStN1CGLK/JBYydUFjg==258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
是字节
2FEA5BE3299C27C3DD290853435C7529BBBC0F0F
这些字节的base64编码形式是
"L+pb4ymcJ8PdKQhTQ1x1Kbu8Dw8="
这意味着您的 SHA1 哈希一开始就是错误的。
尝试digest()
在没有encoding
指定的情况下调用,这样您就可以获得 aBuffer
而不是 a string
,然后验证它是否与上面的字节匹配。
然后使用将这些字节转换为 base64Buffer.toString("base64")
并验证它是否与上面的字符串匹配。
推荐阅读
- flutter - Flutter Provider,使用子小部件更新列表
- php - 在 WordPress MySQL 查询中切换布尔值不起作用
- sql - 将包部署到 SQL Server 时出现 SSIS 部署错误
- c# - EF:手动(非自动生成)密钥需要临时处理新实体
- python - Python - 将烧瓶应用程序的名称更改为 app.py 时出现 ModuleNotFoundError。可能的解决方案?
- mysql - MySQL 在自身上水平连接表
- php - 常量值未在 laravel 视图中打印
- c++ - 使用 opengl 和 SOIL2 从纹理采样给出黑色模型
- python - 如何输入多个键,输出应返回多个值。请检查脚本和我的评论
- reactjs - 反应检查组件是否从 TabView 获得焦点