【问题标题】:Keeping an API Shared Secret secure while using Angular在使用 Angular 时保持 API 共享密钥的安全
【发布时间】:2018-07-16 17:11:18
【问题描述】:

我们有一个现有的 API,我们的一些外部应用程序(Docker 容器等)使用它来回调我们的服务器。它使用 HMAC(共享密钥)系统进行保护。这在从一台服务器向另一台服务器进行调用时非常有用。

但是,我们即将开始慢慢地将我们的网站表单 .NET Web 表单转换为 Angular (v6),我们希望 Angular 能够使用相同的 API 和相同的安全性。

我们设想的是一个单一的 Angular 库,称为 AngularAPICall,它在每个会话开始时实例化,它接受公钥和共享密钥作为参数。然后,每次 Angular 需要回调服务器时,它都会调用 AngularAPICall 内部的一个方法,该方法使用公钥和共享密钥来创建所需的哈希值并构建 API 调用标头。

但是,当在 Angular 等本地客户端平台上使用共享密钥时,我们不确定如何保证共享密钥的安全。我们在哪里/如何存储共享密钥?将它放在 web.config 中不会有任何好处。除了存储它,我们如何将它传递到客户端库AngularAPICall 并保证它的安全?以及我们如何持久化它以便在调用之间保持它?

或者……我们是不是走错了路?我们是否应该重新考虑如何处理我们在 Angular 中使用的 API 安全性?

【问题讨论】:

  • 是的,恐怕没有任何秘密可以在客户端应用程序中真正得到保护,因为所有代码都将下载到用户机器上。可以说无处可藏
  • 不知道为什么会有一个近距离投票,这是一个有效且详细的问题。

标签: c# asp.net .net angular


【解决方案1】:

在客户端中包含任何敏感数据是一个巨大的安全问题。任何用户都可以使用开发者工具来操作客户端,并且它绝不应该包含任何类型的共享机密。

在一天结束时,添加一个像 Angular 或 React 这样的框架可以让你更轻松地构建一个漂亮的 UI,它不会以任何方式保护你。

任何类型的 Web 应用程序都需要额外的身份验证层,因为任何查看网络的人都可以截获一个简单的秘密。

我建议使用oAuthJWT 令牌来验证有效请求。理论上,API 端点只有在带回敏感信息时才应受到保护。我假设人们正在这方面登录这个平台。这些令牌是从服务器生成的,它们在客户端中用于发出请求。您可以假设用户已登录并从该点生成第一个 JWT 令牌,您可以将它们传递给您的 API 请求,因为它只能在经过身份验证的用户的客户端上查看。

当您进入网络的广阔世界时,您需要一些身份验证来保护您的 API,并且那里有很多负载。您在上面所做的事情可能会很快被任何人破解。重新考虑您的身份验证模式,记住服务器不应该信任客户端!

【讨论】:

  • 好的,谢谢。当您收到您的回复时,我已经在阅读有关 JWT 的信息了。blog.angular-university.io/angular-jwt-authentication
  • 是的,JWT 令牌非常好用,而且很容易上手。我强烈推荐 JWT 身份验证。希望我的回答可以帮助您了解需要重新考虑的内容:)
  • 所以看起来我们需要在我们的 API 中拆分安全性。我们将继续使用 HMAC 进行外部服务器调用。当调用来自我们自己(已知)的 URL 时,我们将添加要使用的 JWT。
  • 是的。您可以将这些令牌设置为具有到期日期,因此只需每 14 天生成一次(取决于你们的强迫症程度)。理论上,如果您愿意,您可以在其他系统中使用 JWT 令牌,创建一个管理员级别的长寿 JWT 令牌,这样您就不需要支持 2 种身份验证模式..但这可能需要做很多工作 - 我不知道系统的大小。 JWT 令牌无论如何都会在服务器端创建,因此如果您愿意,它可以用于服务器和客户端请求。 @CaseyCrookston
  • 我很清楚 OAuth 并且目前使用它来确保我的应用程序中的授权,但是我在以 Angular 开发的客户端存储第 3 方密钥时遇到问题。比如说,我有谷歌地图客户端密钥。我应该如何将其安全地存储在我的应用程序中?
【解决方案2】:

我会重新考虑如何从前端使用 API。也许可以查看 Angular 应用程序可以对其进行身份验证的 API 网关。

这个问题的公认答案:https://softwareengineering.stackexchange.com/questions/361949/how-to-secure-web-services-when-authentication-is-done-at-client-side-frontend 在这里似乎非常相关,但 ymmv 至于你如何实现它。

【讨论】:

    猜你喜欢
    • 2015-07-23
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    • 2016-10-06
    • 1970-01-01
    • 2013-07-08
    • 2013-09-12
    • 1970-01-01
    相关资源
    最近更新 更多