我们如何安全地通过网络向用户传递API密钥和秘密令牌?

4

我们如何防止公共API泄露主API密钥/凭据和秘密令牌?

我目前正在开发一个Web应用程序,其中包含一些公共API,应该使用API密钥和秘密令牌,并且正在寻找创建非常安全的API的方法,查看了一些最大平台的API,例如SoundCloud。

阅读一些 指南(例如https://github.com/interagent/http-api-design),关于良好的(RESTful)API设计,但它们没有提供有关安全性(API密钥和令牌)以及在公共API中如何检索或创建它们的信息。

请查看https://a-v2.sndcdn.com/assets/sc-q9dV-e79e4b4a.js,并搜索b45b1aa10f1ac2941910a7f0d10f8e28

这是SoundCloud的主API密钥。

他们的一些网址看起来像这样:
https://api.soundcloud.com/tracks/id/stream?client_id=client_id
https://api.soundcloud.com/tracks/id/stream?secret_token=secret_token&client_id=client_id
https://api.soundcloud.com/playlists/playlist_id/?secret_token=secret_token&client_id=client_id

我知道许多工具已经使用此密钥来获取/下载来自SoundCloud用户的所有歌曲。此外,他们所有的私人和秘密小部件都会显示秘密令牌,还包括请求和源代码中。它们被硬编码在嵌入代码的JavaScript代码中。这个问题已经存在了几年,开发者似乎没有安全API的经验。如何使用JavaScript和JSON实现此类API以防止泄露这些令牌和凭据? http://tunelab.com/2011/08/04/this-is-the-problem-with-soundcloud/ 我对此的想法是:
  • 主API密钥应仅通过soundcloud.com访问/使用
  • 所有API密钥都应有某种域名/IP阻止/限制/防火墙
  • 对于所有API密钥,应使用OAUTH,而不仅仅是没有身份验证的简单JSON API
  • 动态生成一次性(秘密)令牌,不要一直重复使用相同的令牌
  • 动态从SoundCloud服务器获取API密钥和令牌,而不是将它们放入嵌入代码和请求中
  • 使用某种隐写术
当我读到SoundCloud是最大的音乐社区,大型音乐唱片公司上传他们的歌曲并在网站上发布(甚至作为私人歌曲,并公开了相关的秘密令牌),似乎SoundCloud团队不想保护他们的用户免受盗版/歌曲窃取,并且不愿意创建一个安全的API。
你如何看待soundcloud.com上的这种紧急情况,如何才能更安全地使用JavaScript/JSON API,而不会泄露像令牌和API密钥这样的关键数据?例如,使用AJAX在网站加载后检索API密钥和令牌? Spotify和其他流媒体平台如何保护他们所播放的数据并获取令牌和API密钥?将这些信息存储在URL或请求URL中是否安全?

如何使用JavaScript、HTML、AJAX和PHP安全地向用户发送API密钥和秘密令牌?


这是一个有趣且表述清晰的问题。不幸的是,它太宽泛了。设计一个安全的API需要大量的工作,答案可能需要涵盖从使用HMAC对密钥进行哈希到在客户端中安全存储它们的所有内容的文章。因此,我已经投票将该问题关闭为过于宽泛。将其分解为更具体的问题。 - jgauffin
我知道。我编辑了我的问题。我关注的是如何为使用常规网络解决方案(如AJAX和JavaScript)的Web应用程序提供安全的API。我们如何安全地解决这个问题?使用OAUTH?我的问题是:我如何通过无线电波将API密钥和秘密令牌安全地传递给用户?解决方案是否需要浏览器中的某些特殊功能,例如本地存储?我知道,加密媒体扩展仅用于视频,但是否已经或计划对音乐进行类似处理? - user753676
很好。我撤销了我的投票。 - jgauffin
我还添加了一些关于DRM浏览器实现的当前情况的信息(EME仅适用于视频且不在所有浏览器中使用?)。但这只是一个解决方案的想法。 - user753676
好的,谢谢 =) 我认为“如何安全地将API密钥和访问令牌传输给用户”对我来说最重要,这样我们就可以确保仍然有一些控制。 - user753676
显示剩余2条评论
1个回答

2
如何安全地通过网络将API密钥和秘密令牌传递给用户?
唯一可靠的方法是:使用HTTPS为您的网站,以允许用户检索密钥。
然后在API调用期间,不再需要HTTPS。您的用户可以使用HMAC身份验证来使用共享密钥对密钥进行哈希处理。

这听起来不错,所以我们应该使用SSL严格加密所有内容,并将此方法用于整个通信过程?好的。因此,我们的部分(某些私钥)应位于我们的服务器上,用户无法直接访问数据/音乐? - user753676
1
我的回答仅适用于HTTP客户端应用程序。在一个“胖客户端”中可能会有更好的解决方案。 - jgauffin
但可能是保护API密钥和秘密令牌最简单和最好的方法之一。因此,他们只拥有所需凭据的一部分。因此,使用HMCA over SSL的OAUTH将是一个不错的解决方案? - user753676
我更喜欢一个简单的解决方案,只需使用共享密钥+SSL来哈希API密钥。 - jgauffin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接