如何确保我的iphone应用程序是与我的服务器对话的应用程序?

如何确保我的iphone应用程序是与我的服务器对话的应用程序?,iphone,email,Iphone,Email,在iPhone3.0可用之前,我需要发送一封电子邮件,其中包含我的iPhone应用程序生成的内容(图像)以及用户选择的位置 有两种解决方案,skpsmtpmessage库,它不是全部存在,而且仍然存在缺陷;或者写我自己的服务器转发电子邮件。后者对我来说没有问题,但问题是我如何才能确保消息来自我的iPhone应用程序,而不是其他东西 我可以想象使用SSL,但我仍然怀疑有人在越狱的iPhone上拆开我的应用程序,然后使用伪造的连接来运行垃圾邮件 我的第一个想法是让服务器只接受具有精确特性集的数据(例

在iPhone3.0可用之前,我需要发送一封电子邮件,其中包含我的iPhone应用程序生成的内容(图像)以及用户选择的位置

有两种解决方案,skpsmtpmessage库,它不是全部存在,而且仍然存在缺陷;或者写我自己的服务器转发电子邮件。后者对我来说没有问题,但问题是我如何才能确保消息来自我的iPhone应用程序,而不是其他东西

我可以想象使用SSL,但我仍然怀疑有人在越狱的iPhone上拆开我的应用程序,然后使用伪造的连接来运行垃圾邮件

我的第一个想法是让服务器只接受具有精确特性集的数据(例如精确的1个jpg图像、某些精确的JSON数据),而拒绝其他所有内容。当然,它仍然可以服用

这有意义吗?有人做过类似的事情吗


编辑:我不会向我的服务器发送电子邮件,只发送JSON,服务器将生成实际的电子邮件。

尽可能准确地发送电子邮件肯定会减少垃圾邮件。如果您让它执行类似http POST到Web服务器的操作,然后让Web服务器生成消息,那么您将更难处理垃圾邮件。(更可能需要垃圾邮件发送者进行自定义设置)

某种类型的注册系统是你最好的选择,如果你需要先注册,就很难发送垃圾邮件,而且你可以更容易地禁用导致问题的帐户


您无法从应用程序端防止DDOS,因此我不会太担心,只要确保应用程序发送大量数据或执行复杂处理不会太容易。

添加一个包含某种密钥的额外电子邮件头。仅接受标题设置为正确密钥的电子邮件。这将防止随机的人劫持电子邮件服务器,但可能不会阻止将你的应用程序拆开并发现密钥的人


为了使查找密钥比简单地查找密钥更困难,您可以在每个会话的基础上设置密钥。每次应用程序加载时,它都会从电子邮件服务器请求一个密钥,然后在该会话期间发送的所有电子邮件标题中使用该密钥。通过这种方式,您可以实施行为跟踪并禁止恶意用户和机器人(例如,您可以禁止任何发送电子邮件速度超过人类可能速度的用户)。

如果可能,尽可能使界面对垃圾邮件发送者毫无用处。例如,如果要生成一系列对象的电子邮件转储,请将这些对象转换为XML并发送,而不是发送最终电子邮件的文本。垃圾邮件发送者正在寻找最薄弱的环节,如果他们必须投入大量精力使用您的服务,他们将继续前进。

skpsmtpmessage有什么问题吗?

我正在开发的应用程序上做类似的事情。您可以结合使用公钥加密、SSL和本地电话密钥链

  • 首先,iPhone和服务器之间的所有通信都必须加密。如果使用HTTP POST请求和SSL,这是非常简单的。它还可以阻止数据包嗅探器

  • 当你的应用程序启动时,它会在本地密钥链中查找服务器的公共RSA密钥和存储的哈希值。如果找不到,它会使用手机的UDID(以及系统时间)与服务器联系,以生成哈希。它将散列及其公钥的副本发送回手机。然后,服务器在本地数据库(比如MYSQL)中创建一条记录,其中包含UDID及其返回的哈希,以便稍后使用它进行验证

  • iPhone上的应用程序将散列和服务器的公钥保存在其本地安全密钥链中。这都是幕后的握手,即不涉及用户交互。这仅在应用程序第一次运行时完成

  • 从那时起,每次你想发送一封电子邮件,你的应用程序都会格式化你的消息(图像+JSON部分),加上它自己的UDID和它从服务器获得的哈希值,然后使用它在密钥链中的服务器公钥,RSA会对整个消息进行加密。它将此内容添加到服务器的HTTP POST主体中,并将其发送(通过SSL)

  • 服务器获取消息,使用其私有RSA密钥解密消息,解析消息,在其数据库中查找电话UDID,并将接收到的哈希值与第一次运行时保存的哈希值进行比较,以确保它是一台已与之握手的手机。如果经过验证,它会将用户数据格式化为SMTP邮件,并在途中发送。然后,它以状态回复手机

  • 这将在手机和服务器之间建立双向握手。没有创建任何用户级别的帐户,这一切都是在幕后进行的。您在服务器上保存的唯一信息是匿名的手机UDID,因此不应存在任何隐私问题。通信是安全的(SSL),服务器只接受通过握手、存储计算出的哈希值的手机发出的请求,最重要的是,整个数据包通过公钥加密进行加密

  • 如果你想让事情变得有趣,每隔一段时间你就可以用状态结果发回一个新的计算出的哈希值,并让手机替换钥匙链中的那个。这样,即使在这一切之后有人破坏了你的计划,他们也必须随着时间的推移跟上变化

  • 如果用户删除并重新安装了你的应用程序,或者换了一部新手机,你只需再次握手即可。成本是服务器上的额外数据库记录。如果这是一个问题,您也可以将“上次交易”日期与记录一起保存在服务器上,然后每N个月使空闲记录过期一次,并强制手机进行新的握手(而不是将其视为错误消息)。再想一想,你可能无论如何都想这么做。费用是每隔一段时间就有一次短暂的延迟,因为电话通过ha