编写轻量级网络文件传输协议时要注意的安全隐患

时间:2009-08-22 14:43:01

标签: network-programming network-protocols

我有一个桌面应用程序,可以与iPhone应用程序“同步”。同步实际上是一个简单的文件副本 - iPhone应用程序是一个查看器,所以我不必处理以双向方式实际同步数据的复杂性。

我已经编写了自己的协议,因为我需要它是轻量级的,并且我发送的文件可能比设备上可用的RAM大 - 因此,文件将直接从网络流式传输到磁盘。

这些文件由一个“数据”文件(一个SQLite数据库)和零个或多个资源组成,这些资源是图片,PDF等。一旦接受了连接,客户端和服务器就会以块开头进行通信。以下结构:

struct ChunkHeader {
    UInt32 headerLength;
    UInt32 totalChunkLength;
    UInt32 chunkType;
    UInt32 chunkNameLength;
    UInt32 chunkDataLength;
} __attribute__ ((packed));

在struct之后出现UTF-8文件名字符串后紧跟该文件的数据。头结构包含文件名字符串(chunkNameLength)的长度和二进制数据长度(chunkDataLength)的长度。 chunkType包含块的“类型”,因此客户端知道如何处理数据,并且可以是以下之一:

typedef enum {
    kChunkTypePreSyncInfoDictionary = 0,
    kChunkTypeDataFile = 1,
    kChunkTypeResource = 2,
    kChunkTypeEndOfData = 3,
    kChunkTypeSyncCancelled = 4
} ChunkType;

到目前为止,我还没有考虑到安全问题。同步将通过本地WiFi网络进行,该网络可以加密也可以不加密。被复制的数据本身并不包含敏感信息,就像文字处理文档没有那样 - 没有什么能阻止用户输入敏感细节,但是没有要求。

那么,我应该采取哪些措施来确保数据足够安全?我在Objective-C工作,但我不是在寻找语言特定的答案,只是概念。我担心的事情:

  • 我应该采取措施防止数据欺骗吗?
  • 我应该采取措施实际加密数据吗?
  • 我应该采取措施确保其他应用程序不会假装成我的应用程序并用其他东西替换客户端或服务器吗?
  • 我是否应该采取措施检查收到的数据是否有导致损坏的内容?

1 个答案:

答案 0 :(得分:2)

“我是否应该采取措施检查收到的数据是否有导致损坏的内容?”

始终。无条件。没有例外。

对于您的其他问题:

  • 我应该采取措施防止数据欺骗吗?

  • 我应该采取措施实际加密数据吗? (探听)

  • 我是否应该采取措施确保其他应用程序不会伪装成我的应用程序并用其他内容替换客户端或服务器? (再次欺骗)

您说“正在复制的数据不包含敏感信息”,因此窥探似乎不是您关心的威胁情景。

所以,看起来你担心一些欺骗性的威胁情况(你提到过两次)。

这通常通过客户端和服务器之间的某种凭证交换来处理。密码适用于用户身份验证。某种证书可能适用于客户端 - 服务器相互信任。

我们的想法是为客户和服务器提供“足够”的信息,让他们知道对方是值得信赖的。有些人对已知的URL感到满意。其他人想要一些“共享秘密”(如密码)。有些人需要更多,并在协议中包含许多细节。有些人在协议中包含算法细节(例如,HTTP摘要身份验证,要求客户端对服务器提供的数据进行一些算法舞蹈。)