Dao Ke Dao (道可道) -- 消息模块 (Objective-C)
此 文档 介绍了一个用于分布式即时通讯的通用 消息模块。
版权 © 2018-2019 Albert Moky
0. 信封
消息信封
/* example */
{
sender : "moki@4WDfe3zZ4T7opFSi3iDAKiuTnUHjxmXekk",
receiver : "hulk@4YeVEN3aUnvC1DNUufCq1bs9zoBSJTzVEj",
time : 1545405083
}
1. 内容
/* example */
{
type : 0x01, // message type
sn : 412968873, // serial number (message ID in conversation)
text : "Hey guy!"
}
消息内容类型
typedef NS_ENUM(UInt8, DKDContentType) {
DKDContentType_Unknown = 0x00,
DKDContentType_Text = 0x01, // 0000 0001
DKDContentType_File = 0x10, // 0001 0000
DKDContentType_Image = 0x12, // 0001 0010
DKDContentType_Audio = 0x14, // 0001 0100
DKDContentType_Video = 0x16, // 0001 0110
DKDContentType_Page = 0x20, // 0010 0000
// quote a message before and reply it with text
DKDContentType_Quote = 0x37, // 0011 0111
DKDContentType_Money = 0x40, // 0100 0000
// DKDContentType_LuckyMoney = 0x41, // 0100 0001
// DKDContentType_Transfer = 0x42, // 0100 0010
DKDContentType_Command = 0x88, // 1000 1000
DKDContentType_History = 0x89, // 1000 1001 (Entity history command)
// top-secret message forward by proxy (Service Provider)
DKDContentType_Forward = 0xFF // 1111 1111
};
2. 消息
当用户想要发送一条消息时,客户端在发送之前需要执行两步操作:
- 将即时消息加密为安全消息;
- 将安全消息签名以确保其为可靠消息。
相应地,当客户端收到一条消息时,它需要执行两个步骤来提取内容:
- 验证可靠消息即是安全消息;
- 将安全消息解密以获取即时消息。
Message Transforming
~~~~~~~~~~~~~~~~~~~~
Instant Message <--> Secure Message <--> Reliable Message
+-------------+ +------------+ +--------------+
| sender | | sender | | sender |
| receiver | | receiver | | receiver |
| time | | time | | time |
| | | | | |
| content | | data | | data |
+-------------+ | key/keys | | key/keys |
+------------+ | signature |
+--------------+
Algorithm:
data = password.encrypt(content)
key = receiver.public_key.encrypt(password)
signature = sender.private_key.sign(data)
即时消息
/* example */
{
//-------- head (envelope) --------
sender : "moki@4WDfe3zZ4T7opFSi3iDAKiuTnUHjxmXekk",
receiver : "hulk@4YeVEN3aUnvC1DNUufCq1bs9zoBSJTzVEj",
time : 1545405083,
//-------- body (content) ---------
content : {
type : 0x01, // message type
sn : 412968873, // serial number (ID)
text : "Hey guy!"
}
}
内容 -> JSON 字符串: {"sn":412968873,"text":"Hey guy!","type":1}
安全消息
/**
* Algorithm:
* string = json(content);
* PW = random();
* data = encrpyt(string, PW); // Symmetric
* key = encrypt(PW, receiver.PK); // Asymmetric
*/
{
//-------- head (envelope) --------
sender : "moki@4WDfe3zZ4T7opFSi3iDAKiuTnUHjxmXekk",
receiver : "hulk@4YeVEN3aUnvC1DNUufCq1bs9zoBSJTzVEj",
time : 1545405083,
//-------- body (content) ---------
data : "9cjCKG99ULCCxbL2mkc/MgF1saeRqJaCc+S12+HCqmsuF7TWK61EwTQWZSKskUeF",
key : "WH/wAcu+HfpaLq+vRblNnYufkyjTm4FgYyzW3wBDeRtXs1TeDmRxKVu7nQI/sdIALGLXrY+O5mlRfhU8f8TuIBilZUlX/eIUpL4uSDYKVLaRG9pOcrCHKevjUpId9x/8KBEiMIL5LB0Vo7sKrvrqosCnIgNfHbXMKvMzwcqZEU8="
}
可靠消息
/**
* Algorithm:
* signature = sign(data, sender.SK);
*/
{
//-------- head (envelope) --------
sender : "moki@4WDfe3zZ4T7opFSi3iDAKiuTnUHjxmXekk",
receiver : "hulk@4YeVEN3aUnvC1DNUufCq1bs9zoBSJTzVEj",
time : 1545405083,
//-------- body (content) ---------
data : "9cjCKG99ULCCxbL2mkc/MgF1saeRqJaCc+S12+HCqmsuF7TWK61EwTQWZSKskUeF",
key : "WH/wAcu+HfpaLq+vRblNnYufkyjTm4FgYyzW3wBDeRtXs1TeDmRxKVu7nQI/sdIALGLXrY+O5mlRfhU8f8TuIBilZUlX/eIUpL4uSDYKVLaRG9pOcrCHKevjUpId9x/8KBEiMIL5LB0Vo7sKrvrqosCnIgNfHbXMKvMzwcqZEU8=",
signature : "Yo+hchWsQlWHtc8iMGS7jpn/i9pOLNq0E3dTNsx80QdBboTLeKoJYAg/lI+kZL+g7oWJYpD4qKemOwzI+9pxdMuZmPycG+0/VM3HVSMcguEOqOH9SElp/fYVnm4aSjAJk2vBpARzMT0aRNp/jTFLawmMDuIlgWhBfXvH7bT7rDI="
}
(所有数据默认使用 BASE64 算法进行编码)