websocket的key和accept分别是多少个字节

WebSocket的Sec-WebSocket-Key是24字节(192位)的Base64编码字符串,解码后为16字节(128位)的原始随机数据;Sec-WebSocket-Accept是28字节(224位)的Base64编码字符串,解码后为20字节(160位)的SHA-1哈希值。

详细说明:

  1. Sec-WebSocket-Key
    • 生成方式:客户端随机生成16字节(128位)的原始数据,经过Base64编码后形成24字节的字符串。
    • 示例
    • 原始数据(16字节): dGhlIHNhbXBsZSBub25jZQ==(Base64解码后为 "the sample nonce")
    • 编码后(24字节): "dGhlIHNhbXBsZSBub25jZQ=="
    • Sec-WebSocket-Accept
      • 生成步骤
        1. 将客户端的Sec-WebSocket-Key与固定字符串 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 拼接。
        2. 对拼接后的字符串计算SHA-1哈希(20字节)。
        3. 将SHA-1哈希进行Base64编码,得到28字节的字符串。
        4. 示例
          1. 拼接后字符串: "dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
            SHA-1哈希(20字节): [二进制数据]
            Base64编码后(28字节): "s3pPLMBiTxaQ9kYGzzhZRbK+xOo="
        5. 代码验证(Java示例):

        6. import java.security.MessageDigest;
          import java.security.NoSuchAlgorithmException;
          import java.util.Base64;

          public class WebSocketKeyExample {
          public static void main(String[] args) throws NoSuchAlgorithmException {
          // 客户端生成的Sec-WebSocket-Key(Base64编码)
          String clientKey = "dGhlIHNhbXBsZSBub25jZQ==";

          // 1. 解码Base64,验证原始数据长度为16字节
          byte[] decodedKey = Base64.getDecoder().decode(clientKey);
          System.out.println("Decoded Key Length: " + decodedKey.length + " bytes"); // 输出16

          // 2. 拼接固定字符串并计算SHA-1
          String magicString = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
          String concatenated = clientKey + magicString;
          MessageDigest sha1 = MessageDigest.getInstance("SHA-1");
          byte[] hash = sha1.digest(concatenated.getBytes());

          // 3. Base64编码SHA-1哈希,验证输出长度为28字节
          String acceptKey = Base64.getEncoder().encodeToString(hash);
          System.out.println("Sec-WebSocket-Accept Length: " + acceptKey.length() + " bytes"); // 输出28
          }
          }

        7. 输出结果

          Decoded Key Length: 16 bytes
          Sec-WebSocket-Accept Length: 28 bytes
          

          关键点总结:

        8. Sec-WebSocket-Key:客户端发送的Base64字符串,解码后固定为16字节。
        9. Sec-WebSocket-Accept:服务器计算的Base64字符串,编码后固定为28字节。
        10. 协议依据:RFC 6455(WebSocket协议标准)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/95700.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/95700.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单片机开发----一个简单的Boot

文章目录一、设计思路**整体框架设计****各文件/模块功能解析**1. main.c(主程序入口,核心控制)2. 隐含的核心模块(框架中未展示但必备)**设计亮点**二、代码bootloader.hbootloader.cflash.cmain.c一、设计思路 整体…

Day2p2 夏暮客的Python之路

day2p2 The Hard Way to learn Python 文章目录day2p2 The Hard Way to learn Python前言一、提问和提示1.1 关于raw_input()1.2 关于input()二、参数、解包、变量2.1 解读参数2.2 解读解包2.3 解读变量2.4 实例2.5 模块和功能2.6 练习前言 author:SummerEnd date…

【C++设计模式】第二篇:策略模式(Strategy)--从基本介绍,内部原理、应用场景、使用方法,常见问题和解决方案进行深度解析

C设计模式系列文章目录 【第一篇】C单例模式–懒汉与饿汉以及线程安全 【C设计模式】第二篇:策略模式(Strategy)--从基本介绍,内部原理、应用场景、使用方法,常见问题和解决方案进行深度解析一、策略模式的基本介绍1.…

四十岁编程:热爱、沉淀与行业的真相-优雅草卓伊凡

四十岁编程:热爱、沉淀与行业的真相-优雅草卓伊凡今日卓伊凡收到一个问题:「如何看待40岁还在撸代码的程序员?」这让我不禁思考:从何时起,年龄成了程序员职业中的敏感词?在互联网的某些角落,弥漫…

pycharm解释器使用anaconda建立的虚拟环境里面的python,无需系统里面安装python。

Anaconda建立的虚拟环境可以在虚拟环境里设置任何的python版本,pycharm解释器使用anaconda建立的虚拟环境里面的python,比如anaconda建立的虚拟环境1、虚拟环境2,pycharm解释器使用anaconda建立虚拟环境1也可以使用虚拟环境2,根本…

机器学习:后篇

目录 一、KNN算法-分类 样本距离 KNN算法原理 缺点 API 二、模型选择与调优 交叉验证 保留交叉验证(HoldOut) k-折交叉验证(K-fold) 分层k-折交叉验证(Stratified k-fold) 其他交叉验证 三、朴素贝叶斯-分类 理论介绍 拉普拉斯平滑系数 API 四、决策树-分类 理论…

C++17无锁编程实战

在多线程编程里,“锁” 这东西就像把双刃剑 —— 用好了能保数据安全,用不好就麻烦了:大粒度的锁把并发度压得死死的,稍不注意加错锁还可能搞出死锁,程序直接 “僵住”。 但如果能摆脱锁,搞出支持安全并发…

SVT-AV1 svt_aom_motion_estimation_kernel 函数分析

void *svt_aom_motion_estimation_kernel(void *input_ptr) // 运动估计内核主函数,接收线程输入参数{// 从输入参数中获取线程上下文指针EbThreadContext * thread_ctx (EbThreadContext *)input_ptr;// 从线程上下文中获取运动估计上下文指针MotionEstimationCon…

关于NET Core jwt Bearer Token 验证的大坑,浪费3个小时,给各位兄弟搭个桥。

net core 使用jwt Bearer Token 认证获取接口访问权限,前期一阵操作没任何问题,等认证接口写的好了,通过PostMan测试的时候,总是报一个 IDX14102: Unable to decode the header eyJhbGciOiJIUzI1NiIsInR5cCI6 ,错误&a…

系统架构设计师备考第14天——业务处理系统(TPS)

一、TPS的核心概念与定位 1. 定义与演进 定义:TPS(Transaction Processing System)又称电子数据处理系统(EDPS),是处理企业日常事务的信息系统,如财务、库存、销售等局部业务管理。历史地位&…

目标检测系列-Yolov5下载及运行

由于项目需要,最近一直在看目标检测相关的资料,不过纸上得来终觉浅,绝知此事要躬行啊。从今日起,将学习的过程记录一下,作为以后用来复习的材料吧。 我想最快的学习便是直接动手做项目,因此今天就将yolov5模…

Linux内核进程管理子系统有什么第四十二回 —— 进程主结构详解(38)

接前一篇文章:Linux内核进程管理子系统有什么第四十一回 —— 进程主结构详解(37) 本文内容参考: Linux内核进程管理专题报告_linux rseq-CSDN博客 《趣谈Linux操作系统 核心原理篇:第三部分 进程管理》—— 刘超 《…

基于飞算JavaAI的学生成绩综合统计分析系统

第一章:项目概述与背景 1.1 项目背景与意义 在教育信息化飞速发展的今天,学生成绩管理已成为学校教学管理的核心环节。传统的学生成绩管理多依赖于手工操作或基础的信息管理系统,存在数据处理效率低、统计分析功能薄弱、数据可视化缺失等问题…

C++程序员必懂:std::bad_function_call异常的真相与预防秘诀

std::bad_function_call 是 C++ 标准库在 <functional> 头文件中定义的一个异常类型。当程序试图调用一个未持有任何可调用目标(即处于“空状态”)的 std::function 对象时,此异常会被抛出。本文将深入探讨该异常的根本原因、详细的触发场景,并提供一套完整的预防与处…

Html重绘和重排

在网页渲染过程中&#xff0c;重绘&#xff08;repaint&#xff09;和重排&#xff08;reflow&#xff09;是两个重要的概念。理解它们的区别和优化方法对于提升网页性能至关重要。重排&#xff08;Reflow&#xff09;重排是指当页面元素的位置、尺寸等几何属性发生变化时&…

Redis 客户端与服务器:银行的 “客户服务系统” 全流程

目录 一、Redis 客户端&#xff1a;银行的 “客户档案” 二、客户端关闭&#xff1a;银行的 “终止服务规则” 三、命令处理流程&#xff1a;柜员办理业务的 “标准步骤” 1. 接收申请单&#xff08;读取命令请求&#xff09; 2. 确认业务类型&#xff08;查找命令&#x…

HTML图片标签及路径详解

图片是网页内容的重要组成部分&#xff0c;能够使页面更加生动直观。在HTML中&#xff0c;使用<img>标签插入图片&#xff0c;而正确设置图片路径则是确保图片能够正常显示的关键。一、图片标签&#xff08;<img>&#xff09;1. 图片标签的基本语法<img>标签…

【数据库通过日志恢复数据解读】

在数据库恢复机制中&#xff0c;日志文件是实现事务原子性、持久性和崩溃恢复的核心组件。以下通过具体示例和解读方法&#xff0c;结合主流数据库系统的实现细节&#xff0c;详细说明日志文件的内容与分析逻辑。 一、日志文件的核心作用与结构 日志文件通过**预写式日志&#…

【面试题】搜索准确性不高你怎么排查?

系统性排查框架&#xff1a;数据层检查 索引覆盖率&#xff1a;检查文档是否全部正确索引数据新鲜度&#xff1a;确认索引更新频率和延迟文档质量&#xff1a;分析被索引内容的质量和完整性查询理解层 分词分析&#xff1a;检查查询分词是否正确意图识别&#xff1a;验证意图分…

当AI开始“偷吃”用户数据并拼装功能模块:初级开发者的脑洞保卫战与老码农的灵魂蘸料

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录当AI开…