为skynet的crypt库扩展一些加密(摘要)算法支持
改造起因
在上篇文章, 我描述了为skynet
添加稳定的websocket
支持的起始并阐述了这么做的原因.
这几天在测试的时候发现, 当使用skynet
内置的httpc库的时候会遇见crypt
缺少一些我需要用到的算法(例如: crc
、sha256
、hmac_sha256
等等).
这里完全可以假设开发者在框架选型的时候没发现这个问题, 那可能会到开发中期需要第三方平台接入或扩展不同架构的时候才可能会发现了.
显然这将会在无形之中就会给一个项目引入不可预料的稳定性因素. 为了尽可能的避免这个因素, 扩展一些常见的加密(摘要)算法支持是必不可少的.
首选方案肯定使用已经成熟的库. 但是很可惜, lua5.3没有较为可靠并且现成的实现库可以fork
后直接使用.
而且可以用来参考的库仅有: luajit
利用ffi
实现的库、OpenSSL
的实现. 然而这些无法直接或间接移植到lua 5.3.
这是目前遇到的最坏的情况! 最终, 我们只能用Lua的C API来粘合C语言的Crypt实现来完成Lua版本的Crypt扩展库改造工作.
改造开始
我在网上寻找一段时间后发现一个比较不错的Lua sha实现.
这份代码包含md5
、sha128
、sha384
、sha512
的C实现, 其用大量的宏来完成Lua注入动作. 可见我们需要做的第一件事情就是去掉这些不易阅读的宏定义.
我们知道skynet
的luaclib-src/lsha1.c
文件中已经存在了一份sha1实现. 那么我们可以保留sha1, 仅仅提取sha2部分的sha256
与sha512
的实现.
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.
为skynet的crypt库扩展一些加密(摘要)算法支持相关推荐
- GDAL库扩展Landsat系列MTL文件格式支持
Landsat系列卫星提供的数据,一般都是每个波段一个tif文件,然后外加一个MTL.txt的元数据文件,使用gdal可以直接打开每个波段的tif文件,但是有时候想在打开tif数据的同时能够自动读取M ...
- python扩展库扩展名_pip命令也支持扩展名为.whl的文件直接安装Python扩展库。(2.0分)_学小易找答案...
[填空题]已知列表 x = [1, 2],那么执行语句 x.extend([3]) 之后, x的值为__.(2.6分) [填空题]____(telnet/console)可以让管理员从网络中某台电脑登 ...
- 加密扩展库+php,PHP加密扩展库—Mcrypt扩展库
在本文开始正文开始之前,我们先来了解一下什么是PHP加密扩展库:PHP中不但几种加密函数(md5,crypt,sha1),在此之外,PHP中还有一些功能比较全面的加密扩展库!就好比php本来不支持操作 ...
- 在Ubuntu PHP中基于wxsqlite3扩展使用加密的Sqlite数据库
文章目录 一.前提 二.步骤 1.JAVA平台 2. PHP平台 2.1 编译 2.2 开启php的sqlite3扩展 2.3.PHP使用加密数据库 二.最后 一.前提 环境: Ubuntu服务器,已 ...
- python加密库_python基于pyDes库实现des加密的方法
本文实例讲述了python基于pyDes库实现des加密的方法.分享给大家供大家参考,具体如下: 下载及简介地址:https://twhiteman.netfirms.com/des.html 如需要 ...
- 【Android 安全】DEX 加密 ( Java 工具开发 | 加密解密算法 API | 编译代理 Application 依赖库 | 解压依赖库 aar 文件 )
文章目录 一.加密解密算法 API 二.编译代理 Application 依赖库 三.解压代理 Application 依赖库 aar 文件 参考博客 : [Android 安全]DEX 加密 ( 常 ...
- php gd 行间距设置,PHP动态修改GD库扩展问题
编译PHP不带gd,后续添加gd模块 在生成图像验证码的时候我们会用到GD库进行images,我们先安装它. 但是有时候,发现自己已经安装了GD库,但是验证码还是生成不了 这个时候就得检查一下imag ...
- 【MSDN文摘】使用自定义验证组件库扩展 Windows 窗体: Form Scope
使用自定义验证组件库扩展 Windows 窗体,第 2 部分(Windows 窗体探索) 发布日期: 5/28/2004 | 更新日期: 5/28/2004 Michael Weinhardt www ...
- python自带的PIL库扩展图片大小给图片加上文字描述
利用python自带的PIL库扩展图片大小给图片加上文字描述.大多都是库函数调用,只是给定图片宽度后计算文字所需行数的代码需要写. 代码比较丑,but it works. #!/usr/bin/env ...
最新文章
- java 只读数组_在Java 8中创建方法引用数组的速记方法?
- Windows各版本以及漏洞
- org.apache.poi.openxml4j.exceptions.InvalidOperationException: Can't open the specified file
- php序列化和反序列化
- Oracle 增加修改删除字段与添加注释
- 8.深入分布式缓存:从原理到实践 --- 分布式Redis
- mysql 指定ip段 掩码_IP分配及网段划分
- 华为ensp路由器静态路由配置
- 风尚云网学习-css实现文字超出隐藏为省略号...
- 总结解决 No suitable driver found for jdbc:mysql//localhost:3306/ 问题的解决方案,各种情况都已囊括,希望可以帮助到有需要的各位
- 操作系统13章(个人笔记)
- 陶哲轩实分析 习题 12.5.12
- 计算机usb接口指什么,端口是什么?USB口、COM1、COM2、COM3等等又是什么?
- Origin 2017调整画布和图表的尺寸大小
- Java利用HttpClient发送请求生成微信支付二维码、查询支付状态
- 用谷歌浏览器检查功能实现精灵图
- GIS-Spatial4j经纬度距离计算(三)
- 超大文件下载神器(Internet Download manager) IDM
- vue 项目 下载模板和导入模板
- 关于自动白平衡的算法问题
热门文章
- 机器学习:Experiment 5: Regularization
- 芯片加密与解密技术方法
- 词根词缀tort/tour/tox/tract/等词根衍生词汇
- 创建一个长方形类,成员域有长方形的长和宽,成员方法有计算长方形的面积,在main方法中创建长方形类对象,并调用计算长方形面积的方法。
- 简单修改红帽、centos路由及静态路由表
- DevOps-2:持续集成工具Jenkins构建.Net项目
- 基于Java的地理位置定位系统
- 豆腐的做法与编辑的文风
- HTML期末大作业课程设计~仿阴阳师游戏官网首页html模板(HTML+CSS)~动漫主题html5网页模板-HTML期末作业课程设计期末大作业动漫主题html5网页模板-html5网页设计源码...
- Unity 引擎 Managed Stripping Level 遇到的坑