我有一个可以与 iPhone 应用程序“同步”的桌面应用程序。同步实际上是一个简单的文件副本——iPhone 应用程序是一个查看器,因此我不必处理以双向方式实际同步数据的复杂性。
我编写了自己的协议,因为我需要它是轻量级的,而且我发送的文件可能比设备上可用的 RAM 大——因此,文件直接从网络流式传输到磁盘。
这些文件由一个“数据”文件(一个 SQLite 数据库)和零个或多个资源组成,它们是图片、PDF 等。一旦连接被接受,客户端和服务器以块的形式进行通信,以以下结构开始:
struct ChunkHeader {
UInt32 headerLength;
UInt32 totalChunkLength;
UInt32 chunkType;
UInt32 chunkNameLength;
UInt32 chunkDataLength;
} __attribute__ ((packed));
在结构之后是一个 UTF-8 文件名字符串,紧接着是该文件的数据。标头结构包含文件名字符串的长度 ( chunkNameLength
) 和二进制数据长度的长度 ( chunkDataLength
)。chunkType
包含块的“类型”,因此客户端知道如何处理数据,并且可以是以下之一:
typedef enum {
kChunkTypePreSyncInfoDictionary = 0,
kChunkTypeDataFile = 1,
kChunkTypeResource = 2,
kChunkTypeEndOfData = 3,
kChunkTypeSyncCancelled = 4
} ChunkType;
到目前为止,我还没有考虑到安全性。同步将通过本地 WiFi 网络进行,该网络可能已加密,也可能未加密。被复制的数据不会像文字处理文档那样包含敏感信息——如果用户愿意,没有什么可以阻止用户输入敏感信息,但并没有被要求。
那么,我应该采取哪些步骤来确保数据足够安全?我在 Objective-C 工作,但我不是在寻找特定于语言的答案,只是在寻找概念。我担心的事情:
- 我应该采取措施防止数据欺骗吗?
- 我应该采取措施实际加密数据吗?
- 我是否应该采取措施确保另一个应用程序不会假装是我的应用程序并用其他东西替换客户端或服务器?
- 我是否应该采取措施检查收到的数据是否会造成损坏?