1、客户端请求头参数解释
请求头.jpeg
2、测试连接验证的算法
只有当请求头参数Sec-WebSocket-Key字段的值经过固定算法加密后的数据和响应头里的Sec-WebSocket-Accept的值保持一致,该连接才会被认可建立。
随机数验证.png
const crypto = require('crypto');
const btoa = require('btoa'); //It turns binary data to base64-encoded ascii.
// 客户端随机生成的16个字节的随机数,再通过base64编码后的值
const Sec_WebSocket_Key = 'fWx2f7uUjWwEuKkSyZAFNA==';
// 用于服务端计算Sec_WebSocket_Accept的固定的字符串
const Sec_WebSocket_Magic = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11';
// 服务端生成Sec_WebSocket_Accept字段值的规则
// 1、拼接字符串(客户端随机数在前,固定字符串在后)
const key = Sec_WebSocket_Key + Sec_WebSocket_Magic;
// 2、采用SHA-1加密算法生成hash值
const hash_key_hex = crypto.createHash('sha1').update(key).digest(); // Buffer对象缓存二进制数据
const hash_key_hex1 = crypto.createHash('sha1').update(key).digest('hex'); // 生成16进制数据
const hash_key_hex2 = crypto.createHash('sha1').update(key).digest('base64'); // 生成base64编码的数据
console.log('hash_key_hex: %o\n', hash_key_hex);
console.log('hash_key_hex1: %o\n', hash_key_hex1);
console.log('hash_key_hex2: %s\n', hash_key_hex2);
// 3、采用base64对生成的hash值加密
// const base64_hash_key_hex = btoa(hash_key_hex);(btoa)
const base64_hash_key_hex = Buffer.from(hash_key_hex).toString('base64'); //(buffer)
// 实例中的
const Sec_WebSocket_Accept = '44m0OOuQtpbFH+BhSl9iSIQ/s4E=';
// ======================验证成功=================================
// 结果:base64_hash_key_hex: 44m0OOuQtpbFH+BhSl9iSIQ/s4E=
console.log('base64_hash_key_hex: %s\n', base64_hash_key_hex);
// 结果:Sec_WebSocket_Accept: 44m0OOuQtpbFH+BhSl9iSIQ/s4E=
console.log('Sec_WebSocket_Accept: %s\n', Sec_WebSocket_Accept);
// ======================验证成功=================================