处理连接到Web服务的原生应用程序的loginfunction

经过广泛的研究,我一直没能find明确的答案。 首先,任何人都可以告诉我一个本地iPhone应用程序连接到Web服务处理“loginfunction”的基本逻辑? 例如,facebook应用程序在启动后立即要求input用户名和密码,从那里您可以在应用程序的所有后续视图中完全访问您的帐户。 每次你发布的东西等,你不必重新login…有人可以向我解释这个过程? 是通过cookies还是会话完成的? 钥匙扣是否涉及?

我现在有一个半工作的应用程序,但我几乎积极,我可以做得更好,更安全。 这是我在做什么:

1)使用mysqlbuild立一个本地服务器和一个用户数据库(用户名和密码列和其他表等)。 写了一个简单的Web服务,它接收POST数据并查询数据库以检查用户名是否存在,如果是,则密码相同。 使用sha1哈希。 相应地回传真或假。

2)我的应用程序有一个初始login屏幕,有2个文本框(1个用户名,1个用于密码)和一个调用login方法的button。 我的login方法执行以下操作:

  • 用一个string初始化* NSURL(我的web服务的URL:@“http://webservice.com/login.php”)
  • 用这个url初始化一个* ASIFormDataRequst
  • 使用密码和电子邮件文本在文本字段中设置post值
  • 设置委托给自己
  • 在请求上调用startAsycronous
  • 实现requestFininshed方法来检索web服务的“true”或“false”echo-ed
  • 取决于响应,前进到下一个视图,否则,发出警告,通知用户重试

所以,我的问题是:

1)这是安全的发送密码? (通过ASIHTTPRequest和POST方法?)2)在接下来的视图中,用户应该能够与他们的账户进行交互(例如在Facebook上发布消息和状态以及图片)如何保持用户的login状态用户与数据库交互的时间,我可以确保用户仍然login,并且它是相同的用户? 例如,我能想到的唯一方法就是如果我用用户名和密码在用户设备上存储一个cookie,然后每次与Web服务/数据库进行交互,它都会使用cookie值(用户名和密码)。

这样做有更好的方法吗? 也许会话或cookies? 或通过使用钥匙串?

谢谢你们的帮助,对于长期的问题抱歉!


这是我的想法,基于我所知道的:

 1)这是安全的发送密码?  (通过ASIHTTPRequest和POST方法?)

您需要确保您通过https(SSL)发送此信息,而不是普通的Http。 原因是,您无法控制用户无线接入点的位置。 对于你所知道的,用户可以连接到属于特定黑客的开放接​​入点。 传输后,即使密码被散列,他也可以嗅探数据包并获取所需的信息以访问WebService。 通过https发送将确保数据包使用强密钥进行encryption。 即使黑客设法嗅出数据包,在他/她能够解密该消息之前也需要很长时间。

2)在后续的视图中,用户应该能够与他们的账户进行交互(例如在Facebook上张贴>消息和状态以及图片)如何保持用户的login状态>以便每次用户与数据库交互时,我可以确保用户仍然login,并且它是相同的用户?

一种常用的方法是在用户login后获取会话令牌。也就是说,您创build了一个随机生成的ID,您可以在成功login后返回该ID。 然后,您会将此令牌与后端的用户标识进行映射,并与会话超时关联。 每当用户连接到一个web服务时,刷新这个时间,并在一段时间后刷新,以避免违反安全性。 然后,您可以将会话令牌保留在设备中,然后用于随后的通话。 只要会话处于活动状态,用户就已login。由于令牌与特定用户相关联,因此您还要确保调用者的身份。

为了防止别人使用其他人令牌,您需要使用SSL来保护通道并防止嗅探。 假设你已经确保你的连接通道,获得令牌的唯一方法是

  1. 通过loginvalidation身份
  2. 电话被黑客窃取,可以通过检查本地存储来取得令牌。

映射是必要的,所以你可以validation令牌是一个真正的令牌,已经通过login活动与用户相关联。 此外,对于2号,你可以提供远程擦除function,基本上杀死映射,使该标记无效。

该令牌的另一个非常重要的部分是令牌不能被猜测,并且必须是encryption随机的(请参阅随机安全性build议 )。 如果令牌只是基于伪随机性,聪明的黑客可能会猜测它的algorithm,并可以猜测它的下一个/上一个令牌,并有可能在表中获得任何有效的令牌。

有很多algorithm来生成这个令牌。 例如,Java编程语言提供了一个SecureRandom类,以提供密码随机性,而.NET有类似的安全的RandomGenerator类。

如果你想看看OATH提出的基于时间的一次性密码algorithm(TOTP) ,它是HOTP的扩展。 大多数语言/平台将拥有密码强大的随机生成器,您可以立即使用,而无需自己写。

根据你的服务实现/平台,你可能想要问一个合适的类/模块的密码随机生成器,如在这里问“如何用php生成密码安全的随机数”