当前位置: 首页 > 后端技术 > Node.js

使用TypeScript开发Node.js微信开放平台-企业微信-钉钉开放平台消息AES加解密库并发布

时间:2023-04-03 10:16:18 Node.js

先附上链接:https://github.com/ecfexorg/w...因工作原因原因,先后进行了微信开放平台、企业微信、阿里钉钉的第三方开发。在这个过程中,会需要对服务器推送的消息进行解密,经过多次开发发现微信开放平台/企业微信/阿里钉钉的加解密算法都是使用AES256,加密后的消息体结构是一样的。同时,因为我发现的第三方包的代码要么提供的功能太多,要么使用了过时的API,强迫症的我难以承受,于是我造了一个轮子来解决这些需求三方进行消息的加密和解密。是用TypeScript写的,编译生成声明文件,用vscode开发可以有很好的代码提示(不过这么简单的库貌似没什么需求。。。)下面说说用TypeScript开发一个npm项目,发布到npm搭建及开发流程:1、首先在github上创建一个项目。项目名称应与您要发布的npm包名称相同。创建时可以选择是否生成README和证书。这里我选择MIT证书和默认的README。2、然后在本地使用gitclone命令克隆项目,然后cdwx-ding-aes,然后执行npminit,因为该目录下有.git文件夹,所以npm可以自动填入github地址和文档地址的时候初始化和其他包属性。我们在生成的package.json文件的脚本中添加了一个"build":"tsc",所以我们可以通过稍后执行npmrunbuild来编译我们的代码。同时,为了让其他人能够以良好的代码提示使用我们的库,我们在编译时在types文件夹中生成一个声明文件,发布时连同声明文件一起提交,并在package.json中添加一个属性"types":"types/index.d.ts",意思是告诉别人这个库有自己的声明文件,声明文件的入口在types目录下的index.d.ts中。当然,如果你的“main”不是index.js,那么“types”也应该改成和“main”匹配。3、初始化完成后,执行npmitypescript@types/node-D安装TypeScript和Node.js标准库的声明文件。然后在touchtsconfig.json中创建一个TypeScript配置文件。在vscode中写TypeScript配置文件时,会有属性名和属性值的提示。{"compilerOptions":{"target":"es2017","outDir":"dist","module":"commonjs","declaration":true,"declarationDir":"types"},"include":["src"]}我这里的配置很简单,"target":"es2017"表示编译的target的JS版本是es2017;"outDir":"dist"表示编译后的JS文件放在dist文件夹下;"module":"commonjs"表示编译后的JS仍然使用commonjs的模块系统;"declaration":true和"declarationDir":"types"表示编译时会自动生成声明文件,声明文件放在types目录下。"include":["src"]表示将编译src目录下的文件。注意:Node.js从8.5版本开始支持es模块系统,但是写这篇文章的时候还处于实验阶段,需要加上--experimental-modules参数才能使用4.准备工作完成后大功告成,可以开始写代码了,我把所有的代码都放在了src目录下。写完后npmrunbuild可以看到自动生成的dist文件夹里面是编译好的JS文件,types文件夹里面是自动生成的声明文件。关于微信的加解密逻辑,它使用的是标准的cbc模式的aes-256加密算法。算法是可以实现的,但是node.js标准库提供的crypto模块已经存在,这里就不再赘述了。Wheel(看到这个词的人肯定会立马去npmjs.org搜索aes256,但是我觉得一个项目应该尽可能少的依赖,毕竟别人写的东西质量和可维护性是不可控的)。使用aes-256加密时,加密内容的长度应为32字节的倍数。如果不是32的倍数,则需要补全。补全的方式有很多种,最简单的就是用0x00来补全,但是微信需要pkcs7来补全,所以我们这里也用这种方式(肯定会有人再去npmjs.org搜索pkcs7...)。这个补全方法可以用几句话来概括:假设加密内容的长度为x。如果x不是32的倍数,则取32中大于x的最小整数作为y。加密时,在上面加上y-xy-x如果x是32的倍数,那么在加密后的内容后面加上3232两个例子:加密缓冲区的长度是53,大于53和最小倍数的证书32应该是64,64-53=9,那么在这个buffer后面加上9个9,使其长度为64;加密缓冲区的长度为64,那么直接加上32个32s,使其长度变为96。这样做的目的是截取解密后的原始数据。解密后只看最后一个数字(假设是x),然后截掉最后x个字节,得到前面的数据才算完成。向上。上面两个例子,只要第一个看到最后一个数是9,然后去掉最后9个字节,前面一个就是正确的内容。之所以在第二个例子中加了32个32,也是因为可以看到最后一个数是32,然后截掉最后的32个字节。如果因为已经是32的倍数而没有完成,那么完成与否就不知道了。代码就不一一解释了,因为原理在上面。5.写好后npmrunbuild就可以编译了。如果要发布到npmjs.org,首先不是必须发布整个项目中的所有文件。如果发布到npm,应该在package.json的"files"属性中选择你要上传的,比如我为这个项目上传的JS和声明文件以及证书,因为不需要上传源代码。如果您没有npm账号,您必须先注册一个npm账号,然后在终端执行npmlogin登录您的账号。然后运行??npmpublish进行发布。如果担心有时忘记编译执行publish,可以在“scripts”中添加“prepublish”:“npmrunbuild”,意思是每次发布前都会自动执行编译脚本。更多hook命令可以查看npmjs.org的官方文档。6、目前npm发布的包无法通过npmunpublish删除,只能通过npmdeprecate标记过期,所以建议大家不要发布,除非你确定自己有能力和精力去维护一个包一些乱七八糟的包,更何况是一些好的包名你自己都维护不了。如果真的要取消发布,可以发邮件support@npmjs.com说明原因,他们会根据描述进行处理。根据我的经验,由于时差,一般都是白天发邮件,他们会在深夜回复,然后你会在第二天收到回复。希望对大家有帮助:P