当前位置: 首页 > 知识库问答 >
问题:

NodeJS苹果商务聊天REST API,下载解密大号互动消息

安星汉
2023-03-14

我正在阅读apple business chat api文档,我在“接收大型交互式数据有效载荷”部分。最后一步是解密附件,然后发送到业务聊天Api。

下载

---和破译说明文档--

然后,使用密码库,使用AES/CTR/NoPadding算法对文件进行解密,并使用下载附件的附件字典中的密钥值,使用全零16字节初始化向量(IV)。

因此,以下是我对本文档的解释,因为它们使我几乎没有什么可处理的。


// The single-use, 256-bit AES key represented as a hex-encoded string.
const algorithm = 'aes-256-ctr';

// remove the 00 prefix from the hex-encoded string, 
// then decode the string into its original value. 
const key = Buffer.from(decryptKey.substr(2), 'hex');

// Use the decoded key value to decrypt the downloaded attachment file. 

// THE FULL IMPLEMENTATION

const iv = Buffer.alloc(16, 0);
const key = Buffer.from(decryptKey.substr(2), 'hex');
const decipher = crypto.createDecipheriv(algorithm, key, iv);
decipher.setAutoPadding(false)
let decrypted = decipher.update(data, '', 'hex');
decrypted += decipher.final('hex');
console.log("decrypted:", decrypted);

// Finally send to Apple Business Chat Api

    POST https://mspgw.push.apple.com/v1/decodePayload
accept: */*
accept-encoding: gzip, deflate
authorization: Bearer signed-web-token
source-id: business-id
bid: some-bid
 
{ attachment data }

这是传入数据的一部分

��F�ڼ���/��G���� ���)�\M���x�传统知识��Y(���-�-G�ȍ$t��� )

//解密后

D3FFADE249263D1252EE0DCFA6ACCD0BEFF31C6089FF0D31D893ADDE506316A15591E181FB698350FB955F

我不确定当我把解密后的代码发送给苹果API时,我的解密是否正确

邮寄https://mspgw.push.apple.com/v1/decodePayload

它总是代码响应400

我已就此问题联系 Apple 以获取帮助。一旦我收到他们的回复,我将立即更新此文档。

以下是需要采取的步骤的图表。我坚持了最后2步。

共有1个答案

平俊茂
2023-03-14

以下是使用带有NodeJS的apple business chat api解决解密问题的更新。主要问题是在将解密数据发送给苹果进行解码之前,将其转换为缓冲区。

const decryptKeyFromInteractiveRef = "03f30ff3d3d03dc3".toUpperCase()

async function main(decryptKeyFromInteractiveRef) {

const url = await preDownloadUrl();

const data = await downloadPayload(url);

const decipheredData = await decipherInteractiveRef(data);

const decodedData = await appleDecode(decipheredData);
console.log("Finally your data", decodedData);

async function appleDecode(decipheredData) {

    var config = {
        method: 'post',
        url: 'https://mspgw.push.apple.com/v1/decodePayload',
        headers: {
            "Authorization": Authorization,
            "bid": "com.apple.messages.MSMessageExtensionBalloonPlugin:0000000000:com.apple.icloud.apps.messages.business.extension",
            "source-id": BIZ_ID,
            "accept": "*/*",
            "accept-encoding": "gzip, deflate",
            'Content-Type': 'application/octet-stream'
        },
        data: decipheredData
    };

    const { data } = await axios(config);
    const path = Path.resolve(__dirname, 'images', 'data.json')
    fs.writeFileSync(path, JSON.stringify(data))
}


async function decipherInteractiveRef() {

    const iv = Buffer.alloc(16); // buffer alloc fills with zeros
    const key = Buffer.from(decryptKey.slice(2), 'hex',);
    const decipher = crypto.createDecipheriv("aes-256-ctr", key, iv);
    decipher.setAutoPadding(false); // No Padding
    let decrypted = decipher.update(data); // if input is a buffer dont choose a encoding

    return decrypted;
}


async function preDownloadUrl() {
    //Using the fields in the received interactiveDataRef key, 
    // retrieve the URL to the payload by calling the /preDownload endpoint.

    //interactiveDataRef key
    const signatureHex = "81101cc048b6b588c895f01c12715421f9d0a25329".toUpperCase()
    const signature = Buffer.from(signatureHex, 'hex').toString('base64')

    var configInteractiveRef = {
        method: 'get',
        url: 'https://mspgw.push.apple.com/v1/preDownload',
        headers: {
            'Authorization': Authorization,
            'source-id': BIZ_ID,
            'MMCS-Url': 'https://p56-content.icloud.com/MZ02db38070edccb2ce8c972efdcdd25437439745cad6f15473bb7880d436377702752e134be8bd3b4d695567a5d574142.C01USN00',
            'MMCS-Signature': signature,
            'MMCS-Owner': 'MZ02db38070edccb2ce8c972efdcdd25437439745cad6f15473bb7880d436377702752e134be8bd3b4d695567a5d574142.C01USN00'
        }
    };

    const response = await axios(configInteractiveRef)
    return response.data["download-url"];
}

// download big payload from apple
async function downloadPayload(url) {
    const { data } = await axios.get(url, { responseType: 'arraybuffer' });
    return data
}}
 类似资料:
  • 我正在查看此集成文档: https://register.apple.com/resources/business-chat/BC_Sending_an_Auth_Msg.pdf 请参阅“如何解密身份验证令牌”部分 我用的是c#的弹力城堡1.8.3版 我有一个测试控制台应用: 文档说明“示例私钥表示为转换为字节的无符号标量。”并且具有以下值: pX/BvdXXUdpC79mW/jWi10Z6PJb

  • 背景 iOS 10.0-10.1.1上,新出现了一类堆栈为nano_free字样的crash问题,困扰了我们一段时间,这里主要分享解决这个问题的思路,最后尝试提出一个解决方案可供参考。 它的crash堆栈如下图: Thread 0 Crashed: 0 libsystem_kernel.dylib __pthread_kill (in libsystem

  • 我正在使用PHP,MySql和Node.js(socket.io实时聊天)像facebook这样的聊天应用程序。问题是当20个人开始聊天时,我的服务器负载会上升到10-15。我只是在发送方插入消息,并向接收方发送消息ID,接收方从数据库检索消息信息。我有一个Centos服务器有4个物理和4个逻辑核心(共8个核心)和16GB内存。我的网站是在zencart中构建的,当我在静态页面上按f5 1分钟时,

  • 所以我已经从他们的网站上下载了正确的苹果硅android studio安装。当试图安装时,安装过程卡在这条消息上: 正在下载https://dl . Google . com/Android/repository/emulator-Darwin _ aarch 64-8807927 . zip警告:此下载无法从临时状态完成。不缓存重试。正在下载https://dl . Google . com/A

  • 8.10. 示例: 聊天服务 我们用一个聊天服务器来终结本章节的内容,这个程序可以让一些用户通过服务器向其它所有用户广播文本消息。这个程序中有四种goroutine。main和broadcaster各自是一个goroutine实例,每一个客户端的连接都会有一个handleConn和clientWriter的goroutine。broadcaster是select用法的不错的样例,因为它需要处理三种

  • 本文向大家介绍NodeJS实现一个聊天室功能,包括了NodeJS实现一个聊天室功能的使用技巧和注意事项,需要的朋友参考一下 看效果 一直说我喜欢卖关子,这次直接看效果: 聊天界面(喜欢的可以自己画一个比较逼真的页面) 前文 先说一下为什么写这个东西,最近不是在写NodeJS知识点的梳理嘛,但是我发现梳理的过程着实无聊的要死,虽然已经快梳理一半了,只是还没发布,这个不重要,重要的是不做点什么东西确实