Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Gzip 的一个坑

Gzip 的一个坑

作者头像
poslua
发布于 2021-09-01 09:27:57
发布于 2021-09-01 09:27:57
58100
代码可运行
举报
文章被收录于专栏:posluaposlua
运行总次数:0
代码可运行

我们的项目里为了方便部署,swagger 文档是通过 gzip 压缩后,被植入到程序里的。其实这个思路源自于 gRPC ProtoBuf fileDescriptor[1]

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var fileDescriptor_308767df5ffe18af = []byte{    // 2522 bytes of a gzipped FileDescriptorProto    0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x59, 0xcd, 0x6f, 0xdb, 0xc8,    0x15, 0x5f, 0x7d, 0x5a, 0x7a, 0x92, 0x65, 0x7a, 0xec, 0x75, 0x18, 0xef, 0x47, 0x1c, 0xed, 0x66,    0xe3, 0x24, 0xbb, 0xca, 0xc2, 0x49, 0x9c, 0xac, 0x53, 0x6c, 0x2b, 0x4b, 0x8c, 0x57, 0xa9, 0xbe,

每次大家更新完 swagger 文档后,都需要手动生成下这个 fileDescriptor,大概这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ gzip -c swagger.yaml | xxd -p -c 16 | sed -e 's/../0x&,/g'

但是在多人协作的时候,总有个奇怪的问题:swagger 并没有更新,但是这个 fileDescriptor 有时却生成的不一样。并且每次都是文件头的第5-6个字节的位置:

根据 gzip 的 RFC 1952[2] 文档来看:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+---+---+---+---+---+---+---+---+---+---+|ID1|ID2|CM |FLG|     MTIME     |XFL|OS | (more-->)+---+---+---+---+---+---+---+---+---+---+

第5-8个字节为文档的修改时间(timestamp),使用小端模式编码(这也解释了为啥总是前两个字节变化)。动手来验证下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ gzip -c swagger.yaml | xxd -p -c 4 | sed -n '2p'86672361

先转换为大端模式:61236786,再换算成10进制:1629710214,继续转换为本地时间:2021-08-23 17:16:54,发现和文档修改时间一致:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ stat swagger.yaml  File: ‘swagger.yaml’  Size: 16434         Blocks: 40         IO Block: 4096   regular fileDevice: fd00h/64768d    Inode: 205340662   Links: 1Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)Access: 2021-08-23 17:16:54.217753946 +0800Modify: 2021-08-23 17:16:54.148753750 +0800Change: 2021-08-23 17:16:54.148753750 +0800 Birth: -

问题原因梳理明白了,解决就好办了,就像 gRPC 那样直接把这个时间戳置0就好了,好在 gzip 已经提供了这样一个选项:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ gzip -n -c swagger.yaml | xxd -p -c 4 | sed -n '2p'00000000
引用链接

[1] gRPC ProtoBuf fileDescriptor: https://github.com/gogo/protobuf/blob/226206f39bd7276e88ec684ea0028c18ec2c91ae/protoc-gen-gogo/descriptor/descriptor.pb.go#L2705-L2709 [2] RFC 1952: https://datatracker.ietf.org/doc/html/rfc1952#page-5

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 poslua 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
驱动开发:内核LDE64引擎计算汇编长度
本章开始LyShark将介绍如何在内核中实现InlineHook挂钩这门技术,内核挂钩的第一步需要实现一个动态计算汇编指令长度的功能,该功能可以使用LDE64这个反汇编引擎,该引擎小巧简单可以直接在驱动中使用,LDE引擎是BeaEngine引擎的一部分,后来让BeatriX打包成了一个ShellCode代码,并可以通过typedef动态指针的方式直接调用功能,本章内容作为后期Hook挂钩的铺垫部分,独立出来也是因为代码太多太占空间一篇文章写下来或很长影响阅读。
王瑞MVP
2022/12/28
4610
驱动开发:内核LDE64引擎计算汇编长度
kubebuilder实战之二:初次体验kubebuilder
本文是《kubebuilder实战》系列的第二篇,前文将kubebuilder环境准备完毕,今天咱们在此环境创建CRD和Controller,再部署到kubernetes环境并且验证是否生效,整篇文章由以下内容组成:
程序员欣宸
2022/05/06
9750
kubebuilder实战之二:初次体验kubebuilder
深入解析fabric的peer命令(终篇)fabric-protos-go
最后一句endorser.ProcessProposal(context.Background(),signedProposal)在fabric-protos-go包里都做了什么呢?
酒楼
2023/06/04
2840
深入解析fabric的peer命令(终篇)fabric-protos-go
理解Golang组件protobuf
protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单。
平也
2020/04/03
7330
非洲某银行APP安全分析
国庆放假期间领导给了一个任务,分析非洲某银行APP,绕过反抓包,并且分析加密算法,能实现自动登录,这也是我第一次分析APP(以前从未接触,也只是看大佬们的文章),所以记录一下
UzJu@菜菜狗
2022/04/25
2K0
非洲某银行APP安全分析
Go语言,Protobuf 极速入门!
Protobuf 是 Protocol Buffers 的简称,是一种与语言、平台无关,可扩展的序列化结构化数据的数据描述语言,Protobuf作为接口规范的描述语言,可以作为设计安全的跨语言PRC接口的基础工具。
微客鸟窝
2021/11/12
9110
Go语言,Protobuf 极速入门!
AES算法的使用及逆向中的识别技巧
本文属于OneTS安全团队成员flatcc的原创文章,转载请声明出处!本文章仅用于学习交流使用,因利用此文信息而造成的任何直接或间接的后果及损失,均由使用者本人负责,OneTS安全团队及文章作者不为此承担任何责任。
OneTS安全团队
2025/02/07
1980
AES算法的使用及逆向中的识别技巧
Linux系统正则表达式
学习Linux系统的朋友们肯定都会接触到正则表达式,或者开发人员也会遇到这个东东,说起正则表达式,使我想起“会者不难,难者不会”这句话,的确如此,相信很多人刚接触正则表达式,肯定一头雾水,觉得很难学会,是的,民工哥也是这么个感觉,但是相信大家都认真去学习、去练习,肯定能学会的。
民工哥
2020/09/16
1.6K0
Linux系统正则表达式
gRPC: 快速配置通用 API 获取进程元信息
boot.yaml 会告诉 rk-boot 如何启动 gRPC 服务。为了 Demo,除了开启 commonService,我们还开启了如下服务。
尹东勋
2021/12/16
6170
gRPC: 快速配置通用 API 获取进程元信息
GoFrame 框架:Basic Auth 中间件
通过一个完整例子,在 gogf/gf 微服务中添加 Basic Auth 中间件。
尹东勋
2022/01/04
1.1K0
GoFrame 框架:Basic Auth 中间件
探索开源:获取完整的 GitHub 社区数据集
本篇文章聊聊 GitHub 开放数据集的获取和整理,分享一些数据整理的细节技巧,以及一些相对粗浅的数据背后的事情。
soulteary
2023/02/23
1.3K0
探索开源:获取完整的 GitHub 社区数据集
Go之time包用法
time包提供了时间的显示和测量用的函数。日历的计算采用的是公历。 time 类型 type Time struct { // wall and ext encode the wall time seconds, wall time nanoseconds, // and optional monotonic clock reading in nanoseconds. // // From high to low bit position, wall encodes a 1-bit flag (hasMon
孤烟
2022/03/19
3990
shell 学习笔记(16)
转载请注明出处: https://cloud.tencent.com/developer/user/1177713/activities 注:以前的1-15连载部分放在百度空间, 目前百度空间已不支持
用户1177713
2018/02/24
1.5K0
shell 学习笔记(16)
【愚公系列】2023年05月 攻防世界-MOBILE(LoopCrypto)
Objection是一款移动设备运行时漏洞利用工具,该工具由Frida驱动,可以帮助研究人员访问移动端应用程序,并在无需越狱或root操作的情况下对移动端应用程序的安全进行评估检查。
愚公搬代码
2023/05/03
5890
【愚公系列】2023年05月 攻防世界-MOBILE(LoopCrypto)
OV7725寄存器配置_i2c总线通信距离
部分参考链接: OV7725 电器特性和时序图:https://www.cnblogs.com/raymon-tec/p/5087088.html OV7725摄像头的彩色图像采集原理与液晶显示(有必要了解框图):https://blog.csdn.net/huzhoudaxia/article/details/75269392
全栈程序员站长
2022/11/09
4870
OV7725寄存器配置_i2c总线通信距离
基于STM32设计的拼图小游戏
完整工程代码下载地址: https://download.csdn.net/download/xiaolong1126626497/20706318
DS小龙哥
2022/01/12
7030
基于STM32设计的拼图小游戏
golang源码分析:protoc-gen-validate
业务代码中有很多参数校验的代码,如果手动实现,会非常繁琐,https://github.com/go-playground/validator是一个非常不错的选择echo 源码分析(validator),但是对于grpc来说,在定义proto的时候使用直接定义参数的限制规则是一种更合理、更优雅的方式,插件https://github.com/bufbuild/protoc-gen-validate就是来帮助我们实现这一功能的。kratos框架也用到了这个插件。下面我们详细介绍下如何安装和使用。
golangLeetcode
2023/03/14
2.2K0
golang源码分析:protoc-gen-validate
Go是如何实现protobuf的编解码的(1): 原理
各位朋友咱们又见面了,我是大彬,今天聊一聊Go是如何实现protobuf编解码的。
大彬
2019/09/09
1.1K0
Go是如何实现protobuf的编解码的(1): 原理
1.Go语言之标准库学习记录(1)
描述: 我们进行Go语言编程之中当遇到不熟悉的内置函数时, 可以采用go doc builtin [builtinFunName]查看go语言内置函数。
全栈工程师修炼指南
2022/09/29
1.1K0
1.Go语言之标准库学习记录(1)
新160个CrackMe分析-第6组:51-60(下)
老样子,在窗口函数里找nMsg=0x111,wParam=3(通过xspy查的)的分支:
极安御信安全研究院
2022/10/27
5800
新160个CrackMe分析-第6组:51-60(下)
相关推荐
驱动开发:内核LDE64引擎计算汇编长度
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验