我们有一个现有的API,我们的某些外部应用程序(Docker容器等)使用它来回调我们的服务器。使用HMAC(共享密钥)系统对其进行保护。当从一台服务器到另一台服务器进行呼叫时,这非常有用。
但是,我们将开始将网站形式的.NET Web形式缓慢转换为Angular(v6)的过程,我们希望Angular能够使用相同的API和相同的安全性。
我们设想的是一个单一的Angular库,称为AngularAPICall
之类,它在每个会话开始时实例化,接受公共密钥和共享密钥作为参数。然后,每次Angular需要回调服务器时,它都会调用AngularAPICall
内部的方法,该方法使用公钥和共享机密来创建所需的哈希值并构建API调用标头。>
但是,我们不确定在像Angular这样的本地客户端平台上使用共享密钥时如何确保共享密钥的安全。我们在哪里/如何存储共享密钥?将其放在web.config中不会有任何好处。除了存储它,我们如何将其传递到客户端库AngularAPICall
中并保持其安全性?以及我们如何持久保存它以便在调用之间进行维护?
或者...我们会以错误的方式走这条路吗?我们是否应该重新考虑如何处理在Angular中使用的API安全性?
答案 0 :(得分:1)
我会重新考虑您如何从前端使用API。也许要研究一个角度应用程序可以针对其进行身份验证的API网关。
对此问题的公认答案:https://softwareengineering.stackexchange.com/questions/361949/how-to-secure-web-services-when-authentication-is-done-at-client-side-frontend在这里似乎非常相关,但是确切地说明了如何实现。
答案 1 :(得分:1)
客户端中具有任何敏感数据是一个巨大的安全问题。客户端可以由使用开发人员工具的任何用户操纵,并且绝不应包含任何形式的共享机密。
最终,添加诸如Angular或React之类的框架可以使您更轻松地构建漂亮的UI,它不会以任何方式保护您。
任何种类的Web应用程序都需要额外的身份验证层,因为查看网络的任何人都可以截获简单的秘密。
我建议使用oAuth或JWT令牌来验证有效请求。从理论上讲,仅当API端点带回敏感信息时,才应对其进行保护。我假设人们在这方面正在登录该平台。这些令牌是从服务器生成的,并在客户端中用于发出请求。您可以假设用户已登录并从该点生成了第一个JWT令牌,您可以将它们传递给您的API请求,因为它仅在经过身份验证的用户的客户端上可见。
当您进入网络的广阔世界时,您需要进行一些身份验证以保护您的API,并且那里负载很大。您在上面所做的一切都会很快被任何人入侵。重新考虑您的身份验证模式,请记住服务器永远不要信任客户端!