基于 Tongsuo(铜锁)实现国密通信
1 Tongsuo(铜锁)的编译12345git clone https://github.com/Tongsuo-Project/Tongsuo.gitcd Tongsuo./config --prefix=/opt/tongsuo enable-ntls no-sharedmake -jsudo make install
2 生成服务端测试证书
生成一个 EC 密钥对(私钥和公钥),使用 SM2 曲线参数,保存私钥为 server_sign.key 文件:
1openssl genpkey -algorithm ec -pkeyopt ec_paramgen_curve:sm2 -out server_sign.key
使用私钥生成一个证书签名请求(CSR),并将其保存为 server_sign.csr 文件。该请求使用 SM3 散列算法,并且采用给定的主题信息:
1openssl req -config $CONF_DIR/subca.cnf -key server_sign.key -new -out server_sign.csr -sm3 -nodes -subj ...
国密介绍
1 简介铜锁/Tongsuo是一个提供现代密码学算法和安全通信协议的开源基础密码库,为存储、网络、密钥管理、隐私计算等诸多业务场景提供底层的密码学基础能力,实现数据在传输、使用、存储等过程中的私密性、完整性和可认证性,为数据生命周期中的隐私和安全提供保护能力。
铜锁应用场景:
存储加密
网络传输:支持 TLS 、QUIC 、RFC8998、TLCP安全传输协议
密码合规
密钥管理
隐私计算:支持同态加密、零知识证明等算法
铜锁与OpenSSL对比:
2 国密算法介绍国密常见的算法有 SM2 、SM3、SM4、SM9,具体分类如下:
对称加密算法:
SM1算法:对称加密算法,用于替代国际标准的DES算法。
SM4算法:对称分组密码算法,被用于替代国际标准的AES算法。
非对称加密算法:
SM2算法:非对称加密算法,用于数字签名、密钥协商等。
SM9算法:基于椭圆曲线密码体制的身份认证密码学算法。
哈希算法:
SM3算法:密码哈希函数,用于替代MD5、SHA-1等哈希算法。
2.1 SM4 算法2.1.1 简介SM4是对称算法,与国际上的算法 如:AES 对 ...
Nginx支持国密实践
1 简介我国密码行业中有两个主要的通信协议相关的技术标准:
《信息安全技术 传输层密码协议(TLCP)》:即GB/T 38636-2020
《SSL VPN 技术规范》:即GM/T 0024-2014
上述协议关联标准:如数字证书标准GB/T 20518, SM2密码算法标准GB/T 35275等
《SSL VPN技术规范》作为行业标准,部分内容已上升为《信息安全技术 传输层密码协议(TLCP)》国密标准。
国密TLS,又称GMTLS1.1,GMTLS1.1中的1.1代表国密TLS的版本号: _0x0101_。众所周知,目前TLS协议支持的版本:
1234VersionTLS10 = 0x0301VersionTLS11 = 0x0302VersionTLS12 = 0x0303VersionTLS13 = 0x0304
目前主流的TLS软件程序实现中,通信实体在建立TLS连接时,会优先协商使用最大版本号TLS协议 _(版本号越大意味着安全性越高、性能越好)_,因此VersionGMSSL = 0x0101 版本号的设定增加了软件支持的复杂度,这也是阻碍GMTLS1.1广泛应 ...
OpenResty 性能优化
1 性能下降10倍的真凶:阻塞函数OpenResty 之所以可以保持很高的性能,简单来说,是因为它借用了 Nginx 的事件处理和 Lua 的协程机制,所以:
在遇到网络 I/O 等需要等待返回才能继续的操作时,就会先调用 Lua 协程的 yield 把自己挂起,然后在 Nginx 中注册回调;
在 I/O 操作完成(也可能是超时或者出错)后,由 Nginx 回调 resume,来唤醒 Lua 协程。
这样的流程,保证了 OpenResty 可以一直高效地使用 CPU 资源,来处理所有的请求。在这个处理流程中,如果没有使用 cosocket 这种非阻塞的方式,而是用阻塞的函数来处理 I/O,那么 LuaJIT 就不会把控制权交给 Nginx 的事件循环。这就会导致,其他的请求要一直排队等待阻塞的事件处理完,才会得到响应。
下面,我再来介绍几个常见的坑,也就是一些经常会被误用的阻塞函数;
1.1 执行外部命令在业务中通常可以执行一些外部的命令和工具,来辅助完成一些操作。比如杀掉某个进程:
1os.execute("kill -HUP " ...
OpenResty API篇
2 OpenResty开发平台2.1.1 协程和事件驱动在 OpenResty 层面,Lua 的协程会与 NGINX 的事件机制相互配合。如果 Lua 代码中出现类似查询 MySQL 数据库这样的 I/O 操作,就会先调用 Lua 协程的 yield 把自己挂起,然后在 NGINX 中注册回调;在 I/O 操作完成(也可能是超时或者出错)后,再由 NGINX 回调 resume 来唤醒 Lua 协程。这样就完成了 Lua 协程和 NGINX 事件驱动的配合,避免在 Lua 代码中写回调。我们可以来看下面这张图,描述了这整个流程。其中,lua_yield 和 lua_resume 都属于 Lua 提供的 lua_CFunction。
下面是 ngx.sleep 的一段源码,可以帮你更清晰理解这一点。 这段代码位于 ngx_http_lua_sleep.c 中,你可以在 lua-nginx-module 项目的 src 目录中找到它。在ngx_http_lua_sleep.c 中,我们可以看到 sleep 函数的具体实现。你需要先通过 C 函数 ngx_http_lua ...
OpenResty 基础篇
0 参考资料
nginx-lua-module 中文版
nginx-lua-module 原版
API网关:
KONG基于nginx+OpenResty
Envoy
APISIX
0.1 课程目录
1 入门篇1.1 初探OpenRestyOpenResty的三大特性:
详尽的文档和测试用例
同步非阻塞
动态
传统的Web服务器,比如NGINX,如果发生任何的变动,都需要去修改磁盘上的配置文件,然后重新加载才能生效,这是因为没有提供API,来控制运行时的行为。但OpenResty可以使用脚本语言lua来控制逻辑的,动态时Lua天生的优势。
1.2 第一个程序 下边通过使用Lua语言,使用OpenResty启动服务,然后响应打印出“hello world”
安装OpenResty
可以取官网下载源码进行编译安装(enter link description here) 2. 创建工作目录
创建工作目录,然后目录下创建日志和配置文件保存地方
123mkdir geektimecd geektimemkdir logs/ conf/
编写nginx.conf
下边编写一个 ...
Go--基础篇
0 参考资料GO开源项目收集:https://github.com/avelino/awesome-go
01 第一章 Go语言简介1.1 工作区和GOPATH工作区是放置Go源码文件的目录工作区下边有pkg、src、bin三个目录
pkg目录
用于存放归档文件(名称以.a为后缀的文件),所有归档文件都会被存放到该目录下的平台相关目录中,同样以代码包为组织形式
bin目录
用于存放当前工作区中的Go程序的可执行文件
当环境变量GOBIN已有效设置时,该目录会变的无意义
当GOPATH的值中包含多个工作区的路径时,必须设置GOBIN,否则无法成功安装Go程序的可执行文件
1.2 代码包的导入
本地化导入
123import . "strings"HasPrefix("abc", "a") //导入后使用函数不需要加包名
1.3 包管理1.3.1 Go的依赖管理
1.3.2 go mod12345678go mod init mod名称go build 源码文件go mod download 下载依赖包go mod ...
Python--常用工具包
0 参考资料
Pandas中文文档
NumPy中文文档
1 Pandas 数据处理1.1 Pandas 数据结构 - SeriesPandas Series 类似表格中的一个列(column),类似于一维数组,可以保存任何数据类型。
Series 由索引(index)和列组成,函数如下:
1pandas.Series( data, index, dtype, name, copy)
参数说明:
data:一组数据(ndarray 类型)。
index:数据索引标签,如果不指定,默认从 0 开始。
dtype:数据类型,默认会自己判断。
name:设置名称。
copy:拷贝数据,默认为 False。
示例:
1234567891011121314151617181920212223242526272829# 从列表创建Series pd.Series(['a', 'b', 'c']) # 0 a # 1 b # 2 c # dtype: object # 自动创建索引 # 通过字典创建 ...
Python编程语言--进阶篇
0 参考资料
Python核心技术与实战 – Geek
1 Python对象的比较、拷贝1.1 比较is 操作符和 ==操作符:
在 Python 中,每个对象的身份标识,都能通过函数 id(object) 获得。因此,'is'操作符,相当于比较对象之间的 ID 是否相等,
1234567891011121314a = 10b = 10 a == bTrue id(a)4427562448 id(b)4427562448 a is bTrue
对于整型数字来说,以上a is b为 True 的结论,适用于 -5 到 256 范围内的数字。
1234567891011121314a = 257b = 257 a == bTrue id(a)4473417552 id(b)4473417584 a is bFalse
Python 内部会对 -5 到 256 的整型维持一个数组,起到一个缓存的作用。这样,每次你试图创建一个 -5 到 256 范围内的整型数字时,Python 都会从这个数组中返回相对应的引用,而不是重新开辟一块新的内存空间。使用'=='的次 ...
Python编程语言--面向对象
1 类1.1 类的定义和使用12345678910111213141516171819202122 class Dog: """一次模拟小狗的简单尝试。""" def __init__(self, name, age): """初始化属性name和age。""" self.name = name self.age = age self.type = 1 # 给属性指定默认值 def sit(self): """模拟小狗收到命令时蹲下。""" print(f"{self.name} is now sitting.") def roll_over(self): """模拟 ...