在上篇文章, 我描述了为skynet
添加稳定的websocket
支持的起始并阐述了这么作的缘由.git
这几天在测试的时候发现, 当使用skynet
内置的httpc库的时候会碰见crypt
缺乏一些我须要用到的算法(例如: crc
、sha256
、hmac_sha256
等等).github
这里彻底能够假设开发者在框架选型的时候没发现这个问题, 那可能会到开发中期须要第三方平台接入或扩展不一样架构的时候才可能会发现了.web
显然这将会在无形之中就会给一个项目引入不可预料的稳定性因素. 为了尽量的避免这个因素, 扩展一些常见的加密(摘要)算法支持是必不可少的.redis
首选方案确定使用已经成熟的库. 可是很惋惜, lua5.3没有较为可靠而且现成的实现库能够fork
后直接使用.算法
并且能够用来参考的库仅有: luajit
利用ffi
实现的库、OpenSSL
的实现. 然而这些没法直接或间接移植到lua 5.3.segmentfault
这是目前遇到的最坏的状况! 最终, 咱们只能用Lua的C API来粘合C语言的Crypt实现来完成Lua版本的Crypt扩展库改造工做.websocket
我在网上寻找一段时间后发现一个比较不错的Lua sha实现.架构
这份代码包含md5
、sha128
、sha384
、sha512
的C实现, 其用大量的宏来完成Lua注入动做. 可见咱们须要作的第一件事情就是去掉这些不易阅读的宏定义.框架
咱们知道skynet
的luaclib-src/lsha1.c
文件中已经存在了一份sha1实现. 那么咱们能够保留sha1, 仅仅提取sha2部分的sha256
与sha512
的实现.socket
sha2在改形成标准Lua Model实现后可维护性大大提高, 咱们将其命名为lsha2.c
与lsha2.h
来描述显然再好不过. 这时候, 咱们已经可使用这些算法进行测试了.
你们都知道HMAC
是一种哈希
算法, 目前这种哈希
算法的hmac_256
与hmac_512
实现已经在不少云平台广为使用. 一个较为明显的例子就是腾讯云.
在lsha1.c
的文件内已经有了一份HMAC
实现代码, 咱们将xor_str
算法拷贝到lsha2
文件中. 就能够简单的完成扩展.
这里须要知道的是, sha128
与sha256
的Block均可以使用64, 可是hmac_sha512
的block
的长度是128
. 因此咱们为它单独在内部多写了一份代码方便维护.
参照lsha1.c
的hmac_sha128
实现方法扩展hmac_256
与hmac_512
很是简单. 基本上就是改block
与Lua Model编写. 很快就能完成.
skynet的3rd
目录下已经支持md5
. 虽然不知道你们怎么用的, 可是我使用起来感受很是不便. 而且crypt
库支持的hmac64_md5
目前与其它语言对接也较为不便.
最后咱们索性上面提到的代码建立lmd5.c
文件实现一份md5的算法, 而后参照上面的hmac算法又实现了一份hmac_md5
. 这样能让全部算法并存于crypt
库内部.
当你看到这里! 你确定觉得, 咱们的工做已经完成了! 然而这还不够, 既然已经开始动手. 那么一些常见的算法必将都要被归入进来.
咱们最后尝试从redis
的源码文件中拿到crc32
与crc64
的源码, 而后直接提取出来改形成为一个单独的lcrc.c
文件并为其注入Lua C API.
以上, 完成了crypt
的基本改造.
目前测试结果在其它语言集上内容输出一致. 因为实现使用到是C语言, 性能表现方面天然强过一些lua实现. 因此不用过多考虑性能都问题.
既然已经开源了一份Websocket
实现, 那么干脆也开源这份代码吧! 至于命名就延续以前的命名: skynet-lua-crypt
.
因为改造涉及到了skynet的luaclib-src
内的文件修改, 因此编译方法确定不能是普通的3rd方式就能完成编译的.
并且skynet
的一些文件内部也使用到了这个库, 咱们须要直接修改skynet
的Makefile
文件完成这个替换动做. 这样能保证编果更加顺利.
为了跟进版本. 我拉取了skynet
的1.2版本代码进行测试, 通过个人MacBook Pro编译与skynet/test/testsha.lua
文件测试经过而且无反作用.
项目地址在这里. 安装与替换方式很是简单. 基本上就是拷贝源码与替换Makefile.
而且我在项目内提供了一份Makefile用于直接替换, 这在项目的README
中都有描述. 至于为何不提pull request
, 只是以为没有那个必要而已.
更多详细介绍, 请参考项目Release发布介绍与README.