Giter Site home page Giter Site logo

dingtalk-callback-crypto's Introduction

dingtalk-callback-crypto

钉钉回调加解密类库 for deno

  • 因为钉钉回调加密采用了不正规的解密方法, 导致无法使用 Web Crypto 进行解密. 所以暂时使用了第三方库. 等待钉钉修正为正规加密方法, 改为 Web Crypto 解密.

关于钉钉的加密不规范, 再补充一句: Node.js 解密时, 正常都是先调用 .update() 方法, 再调用 .final() 方法, 可是如果处理钉钉加密的信息, 可以调用 .update() 方法, 但如果调用 .final() 方法, Node.js 则会报错.

从第三方的钉钉加解密 Node.js 库也能看出, 若要符合钉钉加密, 则不能按照正常流程走. 需要先按照如下方法在数据的末尾自行补充后再进行加密:

const padCount = 32 - (datau8asize % 32);
const padBuf = new Uint8Array(padCount).fill(padCount);

然后调用 .setAutoPadding(false) 避免系统自动补全. 如此之后, 完成加密.

大概就是 AES-CBC 加密需要特定的 byte 块, 而这个大小应该是 32, 所以如果需要加密的数据不是 32 的倍数, 则自动补充. 但这样魔改的方法属实没必要, 平白增加了不兼容性.

经查, https://www.ietf.org/rfc/rfc3602.txt 中说:

The AES uses a block size of sixteen octets (128 bits).

虽然不限制填充什么, 但是限制必须为 128 位. 钉钉自定义补充的是 32 字节, 256 位. 从 block size 上看, 钉钉补充的似乎也不会导致解密失败.

虽然没找到根本原因, 但钉钉额外 padding 的数据也会导致直接做块解密的拿到不必要的 数据, 这种不标准的 padding 可能正是导致 Web Crypto 失败的原因.

dingtalk-callback-crypto's People

Contributors

iugo avatar

Watchers

 avatar  avatar

dingtalk-callback-crypto's Issues

完成钉钉回调加解密基础功能

大概问题有:

  • 钉钉请求的信息解密. (钉钉的加密不够合规, 但还好 Deno 有第三方库可以解决问题)
  • 向钉钉发送的信息加密. (没问题)
  • 向钉钉发送的信息签名. (没问题)
  • 验证钉钉请求的签名 (我们选择不验证, 没意义, 只要能解密成功, 则说明密钥匹配, 如果密钥丢失, 则 token 一样会丢失, 并且密钥和 token 在钉钉中就是一起设置的)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.