处理连接到 Web 服务的本机应用程序的登录功能

Posted

技术标签:

【中文标题】处理连接到 Web 服务的本机应用程序的登录功能【英文标题】:Handling login functionality for native app connecting to web service 【发布时间】:2011-11-09 22:28:46 【问题描述】:

经过广泛的研究,我无法为我的问题找到明确的答案。首先,谁能告诉我为连接到网络服务的原生 iphone 应用程序处理“登录功能”的基本逻辑?例如,Facebook 应用程序在启动后立即要求输入用户名和密码,从那里您可以在应用程序的所有连续视图中完全访问您的帐户。每次您发布某些内容等时,您都不必重新登录......有人可以向我解释这个过程吗?是通过 cookie 还是会话完成的?涉及钥匙串吗​​?

我现在有一个半工作的应用程序,但我几乎可以肯定我可以做得更好、更安全。这是我正在做的事情:

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

2) 我的应用程序有一个初始登录屏幕,其中包含 2 个文本字段(1 个用于用户名,1 个用于密码)和一个调用登录方法的按钮。我的登录方法执行以下操作:

使用字符串初始化 *NSURL(我的 Web 服务的 url:@"http://webservice.com/login.php") 使用该 url 初始化 *ASIFormDataRequst 在文本字段中使用密码和电子邮件文本设置帖子值 将委托设置为自身 根据请求调用 startAsycronous 实现了 requestFininshed 方法来检索从 web 服务回显的“true”或“false” 根据响应,前进到下一个视图,否则,发出警报告诉用户重试

所以,我的问题是:

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

必须有更好的方法来做到这一点?也许会话或cookie?还是使用钥匙串??

感谢大家的帮助,很抱歉这个问题太长了!


【问题讨论】:

【参考方案1】:

根据我的了解,以下是我的想法:

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

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

    在随后的视图中,用户应该能够与他们的帐户进行交互(例如在 Facebook 上发布 > 消息和状态和图片) 我如何保持用户的登录状态 > 以便用户每次与数据库,我可以确保用户仍然登录 并且是同一个用户?

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

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

    通过登录验证身份 手机被黑客偷走了,他们可以通过检查本地存储来获取令牌。

映射是必要的,因此您可以验证令牌是否是已通过登录活动与用户关联的真实令牌。此外,对于第 2 点,您可以提供远程清除功能,该功能基本上会终止映射并使该令牌无效。

这个令牌的另一个非常重要的部分是令牌不能被猜测并且必须是随机的密码(参见Randomness Recommendations for Security)。如果令牌仅基于伪随机性,那么聪明的黑客可能会猜到它的算法,并且可以猜出它的下一个/上一个令牌,并且有可能获得表中的任何有效令牌。

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

如果您想查看 OATH 提出的算法Time-Based One-Time Password Algorithm (TOTP),它是HOTP 的扩展。大多数语言/平台都有强大的加密随机生成器,您可以立即使用它,但不必自己编写。

根据您的服务实现/平台,您可能想向 SO 要求一个合适的类/模块用于加密随机生成器,例如这里问的"How do you generate cryptographically secure random numbers with php"

【讨论】:

感谢您的回复!关于 https,这个功能在哪里?在服务器上,在应用程序中,还是两者兼而有之?似乎它可能是我的服务器的配置,或者可能是我从 iphone 发送请求的方式发生了变化......而且,我不确定我是否完全理解你所说的关于会话令牌的内容。这是不是一个正确的理解:首先验证用户名和密码... 然后如果无效,返回false;如果有效,则为该用户生成一个随机 ID,并为该用户插入数据库。然后将此ID返回给用户以存储在手机上。对于将来与 Web 服务的每次连接,您都必须传递 ID 和用户名?然后检查该对是否有效?如果您每次都必须这样做,这似乎与向其传递用户名和密码是一样的,而不是通过添加随机 ID 生成器来增加复杂性...... https 配置在服务器端,iPhone 只需将 URL 从 http 更改为 https。至于令牌,您不会传递用户 id 和用户名并检查这对,但您将传递生成的 id(会话令牌)并检查该令牌是否仍然存在。如果是,那么您就可以了,否则您将用户重定向到登录页面(或您决定适合您应用的任何内容) 好吧,这更有意义。但就随机生成的 ID 而言,为什么我们必须将每个令牌映射到一个用户 ID?如果您要检查的只是查看令牌是否还活着,那似乎并不能防止人们通过其他人的令牌连接到 Web 服务...您不需要检查 1) 令牌是否还活着和 2) 与该令牌相关联的用户是发出请求的用户吗...? 为了防止其他人使用其他人令牌是您需要 SSL 来保护通道并防止嗅探的原因。假设您已经保护了连接通道,获取令牌的唯一方法是 1. 通过登录验证身份 2. 手机被黑客窃取,黑客可以通过检查本地存储来获取令牌。映射是必要的,因此您可以验证令牌是通过登录活动与用户关联的真实令牌。此外,对于 2 号,您可以提供远程清除功能,该功能基本上会终止映射并使该令牌无效

以上是关于处理连接到 Web 服务的本机应用程序的登录功能的主要内容,如果未能解决你的问题,请参考以下文章

移动 Facebook 连接到我自己的服务器

在没有 Web 服务的情况下将 Android 应用程序连接到 ASP 网站 [关闭]

Android AsyncTask问题(连接到Web服务)

通过带有 SSL 和证书的 Phonegap 连接到 Web 服务器

无法连接到服务器,服务器:消息 18456,级别 16,状态 1

无法连接到 android 5.1 上的本机本地套接字