为skynet的crypt库扩展一些加密(摘要)算法支持.

栏目: Lua · 发布时间: 1年前

来源: juejin.im

内容简介:在上篇文章, 我描述了为这几天在测试的时候发现, 当使用这里完全可以假设开发者在框架选型的时候没发现这个问题, 那可能会到开发中期需要第三方平台接入或扩展不同架构的时候才可能会发现了.

本文转载自:https://juejin.im/post/5d1bc8ba6fb9a07f0a2dfaad,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有。

在上篇文章, 我描述了为 skynet 添加稳定的 websocket 支持的起始并阐述了这么做的原因.

这几天在测试的时候发现, 当使用 skynet 内置的httpc库的时候会遇见 crypt 缺少一些我需要用到的算法(例如: crcsha256hmac_sha256 等等).

这里完全可以假设开发者在框架选型的时候没发现这个问题, 那可能会到开发中期需要第三方平台接入或扩展不同架构的时候才可能会发现了.

显然这将会在无形之中就会给一个项目引入不可预料的稳定性因素. 为了尽可能的避免这个因素, 扩展一些常见的加密(摘要)算法支持是必不可少的.

首选方案肯定使用已经成熟的库. 但是很可惜, lua5.3没有较为可靠并且现成的实现库可以 fork 后直接使用.

而且可以用来参考的库仅有: luajit 利用 ffi 实现的库、 OpenSSL 的实现. 然而这些无法直接或间接移植到 lua 5.3.

这是目前遇到的最坏的情况! 最终, 我们只能用Lua的C API来粘合 C语言 的Crypt实现来完成Lua版本的Crypt扩展库改造工作.

改造开始

我在网上寻找一段时间后发现一个比较不错的Lua sha实现.

这份代码包含 md5sha128sha384sha512 的C实现, 其用大量的宏来完成Lua注入动作. 可见我们需要做的第一件事情就是去掉这些不易阅读的宏定义.

我们知道 skynetluaclib-src/lsha1.c 文件中已经存在了一份sha1实现. 那么我们可以保留sha1, 仅仅提取sha2部分的 sha256sha512 的实现.

sha2在改造成标准Lua Model实现后可维护性大大提升, 我们将其命名为 lsha2.clsha2.h 来描述显然再好不过. 这时候, 我们已经可以使用这些算法进行测试了.

大家都知道 HMAC 是一种 哈希 算法, 目前这种 哈希 算法的 hmac_256hmac_512 实现已经在很多云平台广为使用. 一个较为明显的例子就是腾讯云.

lsha1.c 的文件内已经有了一份 HMAC 实现代码, 我们将 xor_str 算法拷贝到 lsha2 文件中. 就可以简单的完成扩展.

这里需要知道的是, sha128sha256 的Block都可以使用64, 但是 hmac_sha512block 的长度是 128 . 所以我们为它单独在内部多写了一份代码方便维护.

参照 lsha1.chmac_sha128 实现方法扩展 hmac_256hmac_512 非常简单. 基本上就是改 block 与Lua Model编写. 很快就能完成.

skynet的 3rd 目录下已经支持 md5 . 虽然不知道大家怎么用的, 但是我使用起来感觉非常不便. 并且 crypt 库支持的 hmac64_md5 目前与其它语言对接也较为不便.

最后我们索性上面提到的代码创建 lmd5.c 文件实现一份md5的算法, 然后参照上面的hmac算法又实现了一份 hmac_md5 . 这样能让所有算法并存于 crypt 库内部.

当你看到这里! 你肯定以为, 我们的工作已经完成了! 然而这还不够, 既然已经开始动手. 那么一些常见的算法必将都要被纳入进来.

我们最后尝试从 redis 的源码文件中拿到 crc32crc64 的源码, 然后直接提取出来改造成为一个单独的 lcrc.c 文件并为其注入Lua C API.

以上, 完成了 crypt 的基本改造.

改造结果

目前测试结果在其它语言集上内容输出一致. 由于实现使用到是C语言, 性能表现方面自然强过一些lua实现. 所以不用过多考虑性能都问题.

既然已经开源了一份 Websocket 实现, 那么干脆也开源这份代码吧! 至于命名就延续之前的命名: skynet-lua-crypt .

安装方法

由于改造涉及到了skynet的 luaclib-src 内的文件修改, 所以编译方法肯定不能是普通的3rd方式就能完成编译的.

而且 skynet 的一些文件内部也使用到了这个库, 我们需要直接修改 skynetMakefile 文件完成这个替换动作. 这样能保证编果更加顺利.

为了跟进版本. 我拉取了 skynet 的1.2版本代码进行测试, 经过我的MacBook Pro编译与 skynet/test/testsha.lua 文件测试通过并且无副作用.

项目地址

项目地址在 这里 . 安装与替换方式非常简单. 基本上就是拷贝源码与替换Makefile.

并且我在项目内提供了一份Makefile用于直接替换, 这在项目的 README 中都有描述. 至于为什么不提 pull request , 只是觉得没有那个必要而已.

更多详细介绍, 请参考项目Release发布介绍与README.


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

关注码农网公众号

关注我们,获取更多IT资讯^_^


查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Ruby on Rails实践之路

Ruby on Rails实践之路

沃哈 / 科学 / 2010-5 / 48.00元

《Ruby on Rails实践之路:写给PHP和Java开发者的书》内容简介:Ruby on Rails是基于MVC模式的Web框架,用于开发基于数据库的Web应用。Ruby on Rails中内含了所需的Web服务器WEBrick。该框架配置的数据库除了缺省的MySQL外,还可以是Oracle、SQL Server等其他数据库。《Ruby on Rails实践之路:写给PHP和Java开发者的......一起来看看 《Ruby on Rails实践之路》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具