爲skynet的crypt庫擴展一些加密(摘要)算法支持

改造起因

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章