【问题标题】:REST API built for mobile apps为移动应用构建的 REST API
【发布时间】:2013-01-30 00:17:24
【问题描述】:

我不确定如何正确解决这个问题,但我知道我在这里感到困惑。我并不是要你为我编写代码或提供脚本,我所要求的只是指导。

我已经设置了一个 API(内置于 PHP 的框架)来为应用程序提供资源,主要是 iOS 和 Android。我还阅读了有关 Amazon REST API、Facebook oAuth、Twitter xAuth 等的实现。从应用程序的角度来看,我担心的是身份验证(可能是加密)。

所以最初,用户将下载应用程序然后安装它。用户在应用中看到的第一件事就是登录页面:username & password。用户填写后提交。这就是我的问题所在。我担心应用程序如何将用户名和密码传递给 API。当然,凭据必须加密,这样我才能在服务器上解密,但我对具体过程感到困惑。

我不是移动开发人员,所以也许这就是我对这个过程一无所知的原因。请赐教。

编辑:

登录时的用户名和密码不是用于访问 API 的凭据,而是他帐户的凭据,因此 API 知道用户是否有效,然后返回其个人资料的详细信息。

【问题讨论】:

  • 在我们的大多数应用程序中,我们在服务器端和客户端使用 SHA1 和 MD5。因此,基本上,如果您在使用 SHA1、MD5 和字符串连接的服务器端进行一些加密,它应该适合您。至少这是我在我为 android 和 ios 完成的所有应用程序中使用它的方式。
  • 好的,因为在服务器端用户密码使用crypt()进行哈希处理,Android和iOS有类似的吗?
  • 您可以像我熟悉的那样使用 AES / DES 加密/解密在 Android 和 IOS 中对您的密码进行哈希处理,但是要使事情正常工作,您需要仔细查看它是如何在服务器端完成的,例如设置填充和正确的加密方法,因此您可以在移动应用程序中做出正确的事情。两种方式都需要进行大量测试。

标签: php android ios api


【解决方案1】:

当然,这取决于您对安全性的需求,处理汇款的银行将进一步扩展以提供安全性,但总的来说,以下内容至少应为您的 API 提供安全性,以防任何不会投入数百几个小时的时间,或者是专业的黑客;

首先,您可以通过 https 进行通信,这几乎不需要您付出任何努力。 其次,您可以使用只有您和您的 API 知道的散列和盐(在其之前和/或之后的随机字符,包括盐 before 散列)对密码进行散列。 你不解密它 - 你没有理由知道某人的密码,即使是管理员。 实际上,如果你使用一些标准的东西,比如 MD5 或 SHA1,你甚至无法解密它。 您可以简单地比较 hashed+salted 的值来了解是否允许某人登录。

我猜你可以对用户名做同样的事情,但不是必须的。

再次重申:这不是完全证明的反黑客和安全方法,但它可以满足大多数 API 的安全需求。

【讨论】:

    【解决方案2】:

    除了滚动您自己的身份验证之外,您可能还想利用 Facebook 和 Twitter 等其他登录提供程序。这将要求您在这些提供程序中设置应用程序配置,以重定向回您的应用程序。 https://softwareengineering.stackexchange.com/questions/78587/facebook-and-twitter-authentication-from-mobile-applications

    我还发现了这个关于 REST 身份验证基本指南的页面 - http://www.infoq.com/news/2010/01/rest-api-authentication-schemes

    【讨论】:

    • 我希望,但我不能。公司问题。
    • 即使您使用 HTTP 进行身份验证(并且您应该),这篇文章也有一些关于使用 API 密钥的哈希对请求进行签名的非常好的观点。
    【解决方案3】:

    许多应用程序使用 HTTP 身份验证来使用 API - HTTP 基本就是它所说的,非常基本但不是很安全。更好的是使用 http-auth,它可以安全地使用用户名和密码来保护通信。

    基本上,您只需要配置您必须使用 http-auth 进行 API 调用的任何服务器,并确保它知道您的帐户。

    在 iOS 端使用像 AFNetworking 这样的库来处理与服务器的通信,您可以向库传递用户名/密码以用于验证调用。

    我还建议将用户名/密码存储在应用程序钥匙串中,这样用户就不必每次都输入。

    【讨论】:

    • 这是否意味着用户在登录时输入的用户名和密码将在标题中安全?因为那个用户名和密码不是用来访问 API 而是用来验证和登录他的账户的。
    • 用户名和密码确实在 HTTP-AUTH 的标头中设置(它们在 HTTP-BASIC 中设置)。取而代之的是一个凭证质询,您将获得一个令牌,该令牌将在未来的请求中使用。在某种程度上,URL 框架都会为您处理这个问题(AFNetworking 不仅仅是 NSURLConnection 单独做的)
    • 另外不要忘记 REST 的全部要点是利用现有的 HTTP 框架来完成所有艰苦的工作 - HTTP 身份验证是一个很好理解的东西,它适用于任何地方的路由器并且非常安全。
    【解决方案4】:

    正如其他人所说,您可以使用哈希算法(如 MD5)对密码进行哈希处理。注意this is NOT encryption, it's hashing。您无需将明文密码发送到服务器(或存储它,您存储哈希)。您没有说明用户创建帐户的方式和位置,但您需要确保用于创建密码哈希的算法相同。

    【讨论】:

    • 用户在网站上注册(不是通过应用程序)。他们在网站上创建的用户名和密码可用于登录应用程序。
    猜你喜欢
    • 1970-01-01
    • 2020-03-14
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    • 2013-11-27
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    相关资源
    最近更新 更多