2011-06-10 140 views
26

这可能是一个通用的安全问题,但我想我会问在我正在开发的领域。Web服务API密钥和Ajax - 保护密钥

该方案是:一个Web服务(WCF Web Api),它使用API​​密钥来验证并告诉我该用户是谁,以及jQuery和前端应用程序的组合。

一方面,流量可以是https,所以它不能被检查,但是如果我为每个用户使用相同的密钥(比如说一个GUID),并且我在两个方面都使用它,那么就有可能被采用有人可以冒充用户。

如果我实现了类似于OAuth的东西,那么就会生成一个用户和每个应用程序的关键字,并且这可能会起作用 - 但对于jQuery方面我仍然需要javascript中的应用程序API关键字。

这只会是一个问题,如果有人在实际的计算机上,并做了查看来源。

我该怎么办?

  1. md5或以某种方式加密密钥?
  2. 把密钥放在会话变量中,然后当使用ajax检索它时?
  3. 克服它,这不是什么大问题。

我相信这可能是一个普遍的问题 - 所以任何指针都会受到欢迎。

为了使这个更清晰 - 这是我的API我写了,我查询,而不是谷歌等,所以我可以做每会话令牌等,我只是想制定出最好的以确保我将使用的客户端令牌/密钥的安全。

我在这里有点过于谨慎,但只是用它来学习。

+1

我的投票将是#2。 – 2011-06-10 05:33:24

+0

我的投票也会转到第2位,假设代币也有到期。 – 2011-06-14 00:22:20

回答

2

一般来说,在这样的情况下,请求被授权这样做。如果您想直接使用JavaScript调用服务,那么您需要某种令牌系统,如JSON Web Tokens (JWT),如果服务位于当前域以外的其他位置,则必须解决跨域问题。

2

如何使用jQuery调用服务器端代码来处理与API的通信。如果您使用的是MVC,您可以调用一个包含代码和API密钥的控制器操作来启动您的服务,并将部分视图(甚至是JSON)返回给您的用户体验。如果您使用的是Web表单,您可以创建一个aspx页面,该页面将在后面的代码中执行API通信,然后将内容写入响应流以供UX使用。然后,您的UX代码可以包含一些$ .post()或$ .load()对您的服务器端代码的调用,并且您的API密钥和端点都将受到保护。

+1

我仍然需要提供某种方式来告诉谁是这个人,并确认这可能仍然需要一个令牌? – crucible 2011-06-13 23:33:06

+0

@ justin-schwartzenberger那里的其他人可能会访问我的服务器端代码呢?从技术上讲,他们可以免费访问受保护的资源,除非我保护我的服务器端只能从同一个域执行 – preslavrachev 2013-12-19 17:48:25

7

这取决于如何使用API​​密钥。 Google提供的API密钥与发起请求的网站的URL相关联;如果您尝试在具有替代网址的网站上使用该密钥,则该服务会抛出并出现错误,从而无需保护客户端上的密钥。

然而,一些基本的API绑定到一个客户端,并且可以在多个域中使用,所以在这个例子中,我之前已经将这个API封装在服务器端代码中,并对客户端如何进行通信与当地的服务和保护服务。

但是,我的总体建议是在Web API上应用关于如何使用密钥的限制,从而消除尝试在客户端保护它们的复杂性和必要性。

18

(我建议这个标记后的“安全”。)

首先,你应该清楚你防御什么。你能信任客户吗?一个狡猾的用户可以在你的页面上粘贴一个Greasemonkey脚本,并调用你的UI调用来发送请求的代码。将所有内容隐藏在Javascript闭包中意味着你需要一个调试器;它不会让攻击变得不可能。 Firebug可以跟踪HTTPS请求。还要考虑一个受损客户端:是否安装了键盘记录器?整个系统是否秘密运行虚拟化,以便攻击者可以随时检查任何部分内存?当你像webapp一样被暴露时,安全性是非常棘手的。

不过,这里有几件事情,你要考虑:

  1. 不考虑实际使用按键,而是HMAC哈希值,例如,一个令牌,你马上给认证后。

  2. DOM存储可能比cookie困难一点。

  3. 查看示例安全模型的Google's implementation of OAuth 2。基本上你使用的令牌只能在有限的时间内使用(也许只能使用一个IP地址)。这种方式即使令牌被拦截或克隆,它只在很短的时间内有效。当然,当令牌用完时,你需要小心你的操作;攻击者是否可以做同样的事情你的代码并得到一个新的有效令牌?

不要忽视服务器端安全性:即使你的客户应在提交申请之前已经检查,在服务器上再次检查用户是否确实有权做他们要求什么。事实上,这个建议可能会消除上述大部分内容。

+0

当然,每个用户可以做的服务器端和日志记录的限制和检查,但我想以确保告诉服务器是谁的事情不会受到腐败。 – crucible 2011-06-14 01:22:09