前一段時(shí)間突發(fā)奇想,想白嫖騰訊云云函數(shù)的能力來實(shí)現(xiàn)無服務(wù)模式下 PC 端小程序包的在線解密(注意這里僅僅是做解密)。
因?yàn)闃I(yè)余時(shí)間以搗鼓有意思的東西作為娛樂活動(dòng),對(duì)于小程序技術(shù)這塊本身理解也是比較深刻了,所以碰到相關(guān)需求都會(huì)首先去想:這 gie 能不能用云函數(shù)實(shí)現(xiàn)?
于是碰上這種有意思的功能自然想嘗試用云函數(shù)去搞一下了,順便積累下云開發(fā)經(jīng)驗(yàn),看看無服務(wù)器云函數(shù)到底可以做到什么程度。
開發(fā)前準(zhǔn)備
開發(fā)之前我們是肯定有一套理論指導(dǎo)的,而且這個(gè)算法也是開源的。
主要內(nèi)容如下:
- 文件特征:文件起始為 V1MMWX
- 文件加密方法:
- 首先 pbkdf2 生成 AES 的 key。利用微信小程序 id 字符串為 pass,salt 為 saltiest 迭代次數(shù)為 1000。調(diào)用 pbkdf2 生成一個(gè) 32 位的 key
- 取原始的 wxapkg 的包得前 1023 個(gè)字節(jié)通過 AES 通過 1 生成的 key 和 iv(the iv: 16 bytes),進(jìn)行加密
- 利用微信小程序 id 字符串的倒數(shù)第 2 個(gè)字符為 xor key,依次異或 1023 字節(jié)后的所有數(shù)據(jù),如果微信小程序 id 小于 2 位,則 xorkey 為 0x66
- 把 AES 加密后的數(shù)據(jù)(1024 字節(jié))和 xor 后的數(shù)據(jù)一起寫入文件,并在文件頭部添加 V1MMWX 標(biāo)識(shí)
有這個(gè)理論知識(shí)只要專注實(shí)現(xiàn)就可以了,而且已經(jīng)有大佬實(shí)現(xiàn)了相應(yīng)算法,我們只要拿來測(cè)試改一改就可以了。
本地調(diào)試
這里調(diào)試分別使用了 go 語言版本與 nodejs 版本,go 版本是沒有問題的,node 版需要稍微改動(dòng)一下。
調(diào)試環(huán)境
- MacOS Catalina 10.15.7
- Nodejs 14.17.0
- go 1.17.2 darwin/amd64
本地驗(yàn)證運(yùn)行 go 及 nodejs 版本都沒有問題,然后就是如何遷移到云函數(shù)環(huán)境了。
云端開發(fā)
這里并沒有糾結(jié)于具體使用什么版本的 node,所以一開始就默認(rèn)用了 10.15,在騰訊云的云開發(fā)控制臺(tái)創(chuàng)建應(yīng)用時(shí)如果選擇 koa 應(yīng)用就默認(rèn)是這個(gè)版本。
然后就是一頓操作了:
- 注冊(cè)處理路由;
- 增加文件上傳功能(小文件可以用云函數(shù)直接接收,大的就不行了會(huì)報(bào)請(qǐng)求體大小超限錯(cuò)誤),上傳文件至云存儲(chǔ);
- 觸發(fā)解密操作后從云存儲(chǔ)下載文件;
- 調(diào)用 node 腳本去執(zhí)行解密操作;
- 將解密后文件上傳至云存儲(chǔ)后提供下載鏈接。
文件上傳這塊有個(gè)小插曲,因?yàn)椴恢С执笪募眰?,所以專門問了云函數(shù)產(chǎn)品頁(yè)面上的客服,說云函數(shù)的使用遇到了問題,結(jié)果告訴我說這塊不歸他們管,需要找云開發(fā)團(tuán)隊(duì),然后我就懵了,云函數(shù)不是云開發(fā)下面的產(chǎn)品嗎??咋還不歸他們管??這是什么合作關(guān)系??不過最后為了解決問題我就加了客服微信,然后客服把云開發(fā)的技術(shù)大佬們拉了一個(gè)外部群,群內(nèi)有十幾個(gè)人之多,這陣勢(shì)可讓我是受寵若驚啊。不過最后還是解決了,技術(shù)大佬給了個(gè)方案,扔了幾個(gè)文檔鏈接讓我自己搗鼓,就是看個(gè)文檔手?jǐn)]代碼嘛,沒啥難的,我就"好的"然后自己搗鼓去了。
具體方案就是:
- 前端上傳文件
- 服務(wù)端獲取文件或者獲取文件鏈接
并且額度方面也是夠用的:
所以我就按著大佬給的提示繼續(xù)往下嘗試了,編寫初始版本。
完事之后我們要進(jìn)行調(diào)試。
云函數(shù)調(diào)試
這里要區(qū)分下大小文件的情況,大文件倒是 OK 的,可以正常獲取解密后的文件。
小文件(主要 5M 以內(nèi))的情況下測(cè)試了很多遍,無一例外都失敗了,而且錯(cuò)誤原因是(這個(gè)和是否使用云存儲(chǔ)無關(guān)):
{
"library": "digital envelope routines",
"function": "EVP_DecryptFinal_ex",
"reason": "bad decrypt",
"code": "ERR_OSSL_EVP_BAD_DECRYPT"
}
個(gè)人感覺是云端 nodejs 運(yùn)行時(shí)帶來的版本兼容問題,因?yàn)?10.15 是有些低了,所以將函數(shù)下載到了本地并把運(yùn)行時(shí)改為了相對(duì)較新的 12.16 看看有沒有救。
修改 cloudbaserc.json
里面的 runtime
運(yùn)行時(shí)配置:
{
"envId": "xxx",
"functionRoot": "functions",
"functions": [
{
"name": "koa-decrypt",
"timeout": 50,
"runtime": "Nodejs12.16",
"installDependency": true,
"handler": "tcbindex.main"
}
]
}
然后使用命令行覆蓋上傳云函數(shù)即可更改云端運(yùn)行時(shí)。
不過遺憾的是并沒有作用,錯(cuò)誤依舊。
總結(jié)
使用最新的無服務(wù)模式實(shí)現(xiàn) PC 端代碼包解密功能上云,聽起來有意思但是實(shí)際上做的時(shí)候并沒有那么美麗,一番體驗(yàn)下來感覺就是坑好多啊。不過還好大文件的解密是執(zhí)行成功的,算是成功了一半,要啥 ??。
體驗(yàn)地址
工具地址:PC 代碼包在線解密
AppId:wxd968ed6b8bb866da文章來源:http://www.zghlxwxcb.cn/news/detail-437113.html
測(cè)試包:.wxapkg文章來源地址http://www.zghlxwxcb.cn/news/detail-437113.html
參考資料
- 前端上傳文件
- 服務(wù)端獲取文件
- 獲取文件鏈接
到了這里,關(guān)于看我如何用云函數(shù)擼一個(gè)PC小程序代碼包在線解密工具的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!