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

时间:2009-03-18 04:33:08

标签: iphone email

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

两个解决方案,即skpsmtpmessage库,它并不是全部,而且仍然是错误的;或者写我自己的服务器来转发电子邮件。后者对我来说没有问题,但问题是如何确定消息来自我的iPhone应用程序,而不是其他内容?

我可以想象使用SSL,但我仍然想知道有人在越狱的iPhone上将我的应用程序分开,然后使用假连接通过它运行垃圾邮件。

我的第一个想法是让服务器只接受具有一组精确功能的数据(例如正好1 jpg图像,某些确切的JSON数据)并拒绝其他所有内容。它当然可能是DOS用的。

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

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

5 个答案:

答案 0 :(得分:3)

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

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

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

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

  • 从那时起,每次要发送电子邮件时,您的应用都会格式化您的消息(图像+ JSON部分),添加自己的UDID和从服务器获取的哈希值,然后使用服务器它在钥匙串中的公钥和RSA加密整个混乱。它将此添加到服务器的HTTP POST主体并发送(通过SSL)。

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

  • 这会在手机和服务器之间建立双向握手。没有创建用户级帐户,而是在幕后。您在服务器上保存的唯一信息是匿名电话的UDID,因此不存在任何隐私问题。通信是安全的(SSL),服务器只接受来自已经通过握手的电话的请求,存储计算的散列,并且最重要的是,整个数据包通过公钥加密进行加密。

  • 如果你想让事情变得有趣,你可以每隔一段时间发回一个新的计算哈希值和你的状态结果,并让手机取代钥匙串中的那个。这样,即使有人破解了你的计划,他们也必须跟上时间的变化。

  • 如果用户删除您的应用并重新安装或移动到新手机,您只需再次进行握手即可。成本是服务器上的额外数据库记录。如果这是一个问题,您还可以使用服务器上的记录保存“最后交易”日期,然后每N个月使空闲记录失效,并强制电话进行新的握手(而不是将其视为错误消息)。再想一想,无论如何你可能想要这样做。随着手机再次通过握手序列,费用每隔一段时间就会短暂延迟。

  • 为了使它更加有趣,执行第一次握手的服务器可以是与稍后实际工作的服务器不同的服务器。握手服务器还发回后续请求应该去的URL端点,并且iphone也将其存储在钥匙串中。因此,即使您的应用程序被反编译,他们将获得的只是握手端点的URL。由于大多数数据都是在运行时存储在钥匙串中,因此对越狱手机的代码进行静态分析不会带来太多价值。

  • 另外,为了提高性能,您可能需要考虑在验证后立即在服务器上排队请求并让用户回到他们正在做的事情,然后使用cron作业抽出定期发送SMTP消息。优点是用户响应更好。缺点是,如果电子邮件地址不好,除非您对推送通知感到满意,否则无法回复它们。我将其设为用户偏好,让他们决定是否要等待确认。

  • iPhone的所有技术位已经存在(即不需要第三方库),并且应该可以在使用Rails或Django的服务器上轻松实现。

答案 1 :(得分:2)

尽可能准确地降低垃圾邮件肯定会降低垃圾邮件。如果您对网络服务器执行类似http POST的操作,那么让网络服务器生成消息,您将更难以发送垃圾邮件。 (更有可能要求垃圾邮件发送者自定义设置)

某种注册系统是您最好的选择,如果您需要先注册,那么垃圾邮件就更难了,您可以更轻松地禁用会导致问题的帐户。

你无法阻止应用程序端的DDOS,所以我不会太担心它,只要确保使应用程序发送大量数据或执行复杂处理并不容易

答案 2 :(得分:-1)

添加包含某种密钥的额外电子邮件标头。仅接受使用正确密钥设置标头的电子邮件。这样可以防止随机人员劫持电子邮件服务器,但可能无法阻止将您的应用拆分并发现密钥的人。

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

答案 3 :(得分:-1)

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

答案 4 :(得分:-1)

skpsmtpmessage有什么问题?