在上篇文章, 我描述了爲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.