长安链中的加密算法
本文已参与「开源摘星计划」,欢迎正在阅读的你加入。活动链接:https://github.com/weopenprojects/WeOpen-Star
密码算法库
长安链密码算法库 采用 golang 语言实现,目前支持主流国际密码算法 AES、RSA、ECC 以及 SHA 系列算法,并已经全面支持 SM2、SM3 以及 SM4 国密算法。底层国密实现目前采用了 tjfoc 密码库。
AES:对称加密算
RSA:非对称加密 (数字签名算法)
ECC: 非对称加密 (数字签名算法)
SHA: 哈希算法
密码协议库
长安链密码协议库 包含 国密 x509、国密 TLS ,并兼容国际 x509、国际 TLS 标准。 国密 TLS 实现库包含 golang 国密 tls 和 java 国密 tls 两个实现。
X.509:是一种证书格式,对 X.509 证书来说,认证者总是 CA 或由 CA 指定的人,一份 X.509 证书是一些标准字段的集合,这些字段包含有关用户或设备及其相应公钥的信息。X.509 的证书文件,一般以.crt 结尾,根据该文件的内容编码格式,可以分为以下二种格式:
PEM - Privacy Enhanced Mail,打开看文本格式,以"-----BEGIN..."开头, "-----END..."结尾,内容是 BASE64 编码,Apache 和*NIX 服务器偏向于使用这种编码格式。
DER - Distinguished Encoding Rules,打开看是二进制格式,不可读,Java 和 Windows 服务器偏向于使用这种编码格式。
TLS:传输层安全协议 Transport Layer Security 的缩写
golang 国密 tls:在 golang 标准库(golang1.14 版本)基础上,增加了 SM2 算法、SM3 算法、国密 X509 以及 SM2-SM3 算法套件支持,并独立为单独的国密协议库。
SM2:非对称加密
SM3:哈希
2.java 国密 tls:包含国密算法部分和国密 TLS 协议两个部分。
国密算法部分 Java 侧由 Java 标准库 CurveDB 类 提供,国密通过反射机制注入到 Java 标准库,国密算法实现自主研发,符合国密算法标准。
国密 TLS 协议 部分主要由长安链 国密 openssl 提供,Java 侧通过反射机制将 SM3WithSM2 标识注入到 netty ssl io.netty.handler.ssl.ExtendedOpenSslSession
支持的签名算法 LOCAL_SUPPORTED_SIGNATURE_ALGORITHMS
列表中,Java netty 通过 netty-tcnative 调用 openssl 底层密码功能。
目前 netty-tcnative 已支持 macOS、linux、windows 以及 linux_aarch 等平台,并在长安链 chainmaker-java-sdk 中实现了 平台兼容性 ,用户只要下载长安链官方 java sdk 就可以实现客户端与链的国密 TLS 通信,无需关心 netty-tcnative 国密的跨平台问题。
国密 openssl
SSL:安全套接字层 Secure Socket Layer 的缩写
OpenSSL 相当于 SSL 的一个实现,如果把 SSL 规范看成 OO 中的接口,那么 OpenSSL 则认为是接口的实现。接口规范本身是安全没问题的,但是具体实现可能会有不完善的地方,比如之前的"心脏出血"漏洞,就是 OpenSSL 中的一个 bug.
长安链的国密 openssl 实现是在 OpenSSL-1.1.1l 的基础上改造的。OpenSSL 在 1.1.1 版本中引入了国密算法的实现,但是仅仅提供了算法接口,没有把国密算法引入到任何通信协议中去支持。 长安链国密 openssl 把国密算法的支持加入到 X509 协议 中。主要包括:
按 PKCS8 标准实现 SM2 私钥的编码序列化;
按 PKIX 定义的公钥编码方式实现 SM2 算法公钥的序列化;
实现 ECC 编码的 SM2 签名的序列化;
将 SM2 算法、SM3 算法、SM2-SM3 算法套件、SM2 曲线的 OID 引入到 X509 的逻辑中。
1994 年,网景(Netscape)公司开发了 SSL 协议(Secure Sockets Layer)的 1.0 版,这是构建传输安全层的起源,但是 SSL 1.0 从未正式对外发布过。
1995 年,Netscape 把 SSL 升级到 2.0 版,正式对外发布,但是刚刚发布不久,就被发现有严重漏洞,所以并未大规模使用。
1996 年,修补好漏洞的 SSL 3.0 对外发布,这个版本得到了广泛的应用,很快成为 Web 网络安全层的事实标准。
1999 年,互联网标准化组织接替网景公司,将 SSL 改名为 TLS(Transport Layer Security),随即就形成了传输安全层的国际标准。第一个正式的版本是 RFC 2246 定义的 TLS 1.0,该版 TLS 的生命周期极长,直到 2020 年 3 月,主流浏览器(Chrome、Firefox、IE、Safari)才刚刚宣布同时停止 TLS 1.0/1.1 的支持。而讽刺的是,由于停止后许多政府网站被无法被浏览,此时又正值新冠病毒的爆发期,Firefox 紧急发布公告宣布撤回该改动,因此目前 TLS 1.0 的生命还在顽强延续。
2006 年,TLS 的第一个升级版 1.1 发布(RFC 4346),但它除了增加对 CBC 攻击的保护外,几乎没有任何改变,沦为了被遗忘的孩子,当时也很少有人会使用 TLS 1.1,甚至 TLS 1.1 根本都没有被提出过有啥已知的协议漏洞。
2008 年,TLS 1.1 发布 2 年之后,TLS 1.2 标准发布(RFC 5246),迄今超过 90% 的互联网 HTTPS 流量都是由 TLS 1.2 所支持的,现在我们仍在使用的浏览器几乎都完美支持了该协议。
2018 年,最新的 TLS 1.3(RFC 8446)发布,比起前面版本相对温和的升级,TLS 1.3 做出了一些激烈的改动,修改了从 1.0 起一直没有大变化的两轮四次(2-RTT)握手,首次连接仅需一轮(1-RTT)握手即可完成;在有连接复用支持的时候,甚至可以把 TLS 1.2 原本的 1-RTT 下降到 0-RTT,显著提升了访问速度
评论