elixirChain / dingtalk-encrypt

dingTalk encrypt Node Version. 钉钉的非官方nodejs版AES加解密库 sdk
https://www.npmjs.com/package/dingtalk-encrypt
Apache License 2.0
18 stars 8 forks source link

推送审批时title乱码 #1

Closed moshengrenzenme closed 2 years ago

moshengrenzenme commented 3 years ago

推送审批时title会有中文乱码,单重不可读

qq578023708 commented 3 years ago

乱码,这样可解 打开文件 lib\api\encrypt\DingTalkEncryptor.js 函数encrypt 和 函数decrypt 中的 CryptoJS.enc.Latin1 改为 CryptoJS.enc.Utf8 即可 async encrypt(random, plainText) { try{ let unEncryptStr=random; unEncryptStr+=Utils.bin2String(Utils.int2Bytes(plainText.length)); unEncryptStr+=plainText; unEncryptStr+=this.corpid; unEncryptStr+=PKCS7Padding.getPaddingBytes(unEncryptStr.length); unEncryptStr=CryptoJS.enc.Utf8.parse(unEncryptStr); const encrypted= CryptoJS.AES.encrypt(unEncryptStr,this.keySpec,this.encryptOption); return encrypted.toString(); }catch(err){ console.log(err); throw new DingTalkEncryptException(900007); } }

async decrypt(encrypted) { let orgText; try{ const decrypted= CryptoJS.AES.decrypt(encrypted,this.keySpec,this.encryptOption); orgText= CryptoJS.enc.Utf8.stringify(decrypted); }catch(err){ console.log(err); throw new DingTalkEncryptException(900008); } let noPad; let networkOrder; let fromCorpid; let planText; try{ noPad= PKCS7Padding.removePaddingBytes(orgText); networkOrder=noPad.substr(16,20); const planTextLength= Utils.bytes2int(Utils.string2Bin(networkOrder)); planText=noPad.substr(20,20+planTextLength); fromCorpid=noPad.substr(20+planTextLength,noPad.length); }catch(err){ console.log(err); throw new DingTalkEncryptException(900009); } if(fromCorpid!==this.corpid){ throw new DingTalkEncryptException(900010); }else{ return planText; } }

moshengrenzenme commented 3 years ago

Latin1

试了一下,还是不行,感觉像是钉钉的加密和js的加解密用的不太一样,报的Malformed UTF-8 data Error: Malformed UTF-8 data at Object.stringify (node_modules/_crypto-js@3.3.0@crypto-js/core.js:478:24) at DingTalkEncryptor.decrypt (node_modules/_dingtalk-encrypt@1.2.1@dingtalk-encrypt/DingTalkEncryptor.js:65:39) at DingTalkEncryptor.getDecryptMsg (node_modules/_dingtalk-encrypt@1.2.1@dingtalk-encrypt/DingTalkEncryptor.js:129:19)

qq578023708 commented 3 years ago

Latin1

试了一下,还是不行,感觉像是钉钉的加密和js的加解密用的不太一样,报的Malformed UTF-8 data Error: Malformed UTF-8 data at Object.stringify (node_modules/_crypto-js@3.3.0@crypto-js/core.js:478:24) at DingTalkEncryptor.decrypt (node_modules/_dingtalk-encrypt@1.2.1@dingtalk-encrypt/DingTalkEncryptor.js:65:39) at DingTalkEncryptor.getDecryptMsg (node_modules/_dingtalk-encrypt@1.2.1@dingtalk-encrypt/DingTalkEncryptor.js:129:19) 你用得什么框架,如果是eggjs, 可以试试 egg-dd ,你单独提取出来使用也可以,我克隆了一个 egg-dd-corp

moshengrenzenme commented 3 years ago

Latin1

试了一下,还是不行,感觉像是钉钉的加密和js的加解密用的不太一样,报的Malformed UTF-8 data Error: Malformed UTF-8 data at Object.stringify (node_modules/_crypto-js@3.3.0@crypto-js/core.js:478:24) at DingTalkEncryptor.decrypt (node_modules/_dingtalk-encrypt@1.2.1@dingtalk-encrypt/DingTalkEncryptor.js:65:39) at DingTalkEncryptor.getDecryptMsg (node_modules/_dingtalk-encrypt@1.2.1@dingtalk-encrypt/DingTalkEncryptor.js:129:19) 你用得什么框架,如果是eggjs, 可以试试 egg-dd ,你单独提取出来使用也可以,我克隆了一个 egg-dd-corp

用的是thinkjs,按道理来说两个应该都没问题,就是不知道为啥不行

senique commented 3 years ago

暂时将中文 encodeURI 编码后再加密

moshengrenzenme commented 3 years ago

暂时将中文 encodeURI 编码后再加密 问题是这个是钉钉推送的,不是我调用的推送接口

senique commented 2 years ago

使用 v2.0.0 试试

senique commented 2 years ago

最新版 v2.0.1 已经发布