移动到服务器API安全性

时间:2011-04-22 19:58:03

标签: security api mobile titanium appcelerator

我的任务是设计一个系统,让我们的用户也可以使用他们的手机登录他们的帐户并与我们的服务进行互动。我担心应用程序的安全性。

基本上,我们允许人们使用Facebook或Twitter通过OAuth登录。移动应用程序(使用Appcelerator钛构建)也应该这样做。成功登录手机后,我需要通知我的应用程序有人使用FB或Twitter登录,以便我的应用程序可以检索用户的应用程序特定的用户ID。

我的第一个想法是编写一个手机可以调用的API,以接受Facebook或Twitter userId等参数。我会查询我的数据库并找到他们的内部用户ID并将其返回到手机。

这样可以正常工作,但是它完全没有安全感。任何人都可以使用Facebook用户ID访问相同的API,而API只会返回内部ID(以及应用程序所需的任何其他数据),而不知道请求是否已获得授权。

这是我的第一个移动应用,所以我不太确定在我的API上实现安全性的正确方法。

4 个答案:

答案 0 :(得分:2)

  1. 如果可以,请使用https,解决了很多问题。
  2. 成功登录后,您可以创建会话并将sessionid传递给客户端,我建议您这样做 使用RSA方式发送sessionid(对于有人可以嗅探你的sessionid的情况)
  3. 使用哈希签名确保请求未在途中修改,但此方法无法阻止重新发布问题。
  4. 最后,对于您的问题,如果有新的进展,请告诉我,谢谢!

答案 1 :(得分:2)

我也遇到过这个问题,对用户进行身份验证非常简单,但对设备进行身份验证要困难得多。就像你说的那样,任何人都可以连接到你的API并通过Facebook呈现经过身份验证的用户并访问你的API。

您可以使用相互SSL身份验证来处理它,但如果密钥在任何单个移动设备上受到威胁,则整个API都会受到攻击,因为所有设备在安装时都会使用应用程序附带的相同密钥对。

我最终做的是强制设备在首次安装应用时使用我的API注册自己。设备向我的服务器发出API调用,并发出API密钥,然后必须使用它来进行所有其他API调用。这是不安全的,因为您可以编写脚本来注册自己并获取API密钥,但它确实允许我监视API使用并关闭表现不佳的设备。

这是我能想到的最好的方法,一种锁定我在带外识别的未经授权的设备的方法。

答案 2 :(得分:0)

我有同样的问题,我通过创建自己的API(PHP)与代理服务器(NodeJS)来解决它。我的客户端的每个请求都被发送到代理服务器,代理服务器验证请求并将其传递给我的API。 API仅允许来自代理服务器的IP请求。

首先,用户使用Authorization标头对代理服务器进行身份验证,如果成功,则用户将获得2个令牌。访问令牌和刷新令牌。在我的案例中,访问令牌用于发出请求和生命5分钟。当访问令牌过期时,用户可以使用永久存在的刷新令牌刷新令牌。

在您的应用中创建一个处理您的关键逻辑的全局模块,将您的密钥存储在本地属性中,并在用户重新启动应用时使用它们,这样他们就不必每次都重新登录。

如果您在HTTPS中使用此功能,则无法嗅探密钥,并且如果您对应用进行反编译,则无法检索密钥,因为这些密钥存储在用户设备上而不是“硬编码” #39;在应用程序本身。从技术上讲,如果攻击者拥有用户的设备,他就能够反编译应用程序并检索密钥。我知道这一点,但如果他已经访问了物理设备,他仍然可以使用任何应用程序。

代理服务器还记录每个传入的请求,并在有人尝试技巧时通过电子邮件通知我(我自己创建了这个)。我使用了以下模块:

  • 表达
  • HTTPS
  • http-proxy(将请求代理到我的API)
  • jsonwebtoken(生成并验证访问/刷新令牌)

答案 3 :(得分:-6)

大多数API设置包括某些类型的secretKey或APIKey,这对开发人员来说是唯一的。由于您是唯一的开发人员,因此您可以在移动应用中设置密钥/哈希值,以便成功返回数据。

http://lcsd05.cs.tamu.edu/slides/keynote.pdf是Google发表的关于从头开始设计优秀API的基调。

另请查看此previous question