在AngularJS应用程序中保护OAuth clientId/clientSecret

jri*_*sta 13 security oauth token secret-key angularjs

我知道这可能是一个古老的问题,但是......在AngularJS应用程序中是否有保护客户机密以执行OAuth2身份验证的最佳实践?我一直在努力思考一种解决方案,试图从现代风格的Web应用程序中提供对API的真正安全访问(它们不一定是AngularJS.)根据我的经验,添加抽象层和混淆层真的不做任何提高安全性的东西......他们只是让任何潜在的黑客更难破解安全蛋(但是他们中的许多人更喜欢挑战,所以你真正做的只是让黑客变得更有趣.)

除了显而易见的无效解决方案,例如代码混淆和卷积以及类似的事情,在现代Web应用程序中是否有保护客户机密的最佳实践?我知道这些问题出现在桌面客户端应用程序中,而且我不相信除了"可能会混淆,这会减慢黑客的速度"之外,还有一个解决方案.我们和网络应用程序在一起吗?这个问题没有真正的解决方案吗?

如果没有解决方案......使用OAuth保护REST API是否真的有任何意义?

Dav*_*ich 23

请记住,OAuth不是为了防止冒充,而是为了保护凭据.第三方在不泄露用户凭据的情况下为您验证用户的身份.由于令牌不是凭证,黑客可以做的伤害量和他的行动窗口是有限的.

但是对于您的应用程序而言,OAuth本身并不比常规用户名/密码验证更安全.在客户端应用程序上,所有代码都可供全世界查看!如您所述,客户端加密是一个值得怀疑的策略.


虽然没有建立保护客户互动的最佳做法,但以下是一些最小化您的风险的方法:

1)SSL:银弹?也许.您在网站和请求中使用SSL的次数越多,用户的请求就越安全.老实说,我认为所有特权请求都应该由加密请求提出.

2)短令牌寿命:令牌的寿命越短,嗅探它的激励/优势就越少.

OAuth 2.0通过为身份验证令牌交换刷新令牌的身份验证令牌,从身份验证中创建一个持续的聊天.你,正在开发人员正在开发一个健谈的应用程序,它做了很多"你的令牌是什么,这是另一个令牌,问我一个令牌,这是你的新令牌......所以你想要什么?" ......"哎呀,时间到了,你的刷新令牌在哪里?"

如果这听起来像是一种痛苦,那就有点儿了.OAuth 2.0旨在让开发人员更轻松地完成此过程.但重要的是,您的令牌的使用寿命越短,黑客就越难以保持欺诈性身份. 刷新令牌参考

3)强制执行你的领域:想让嗅探器更少的机会滥用你的盔甲中的缝隙?不允许跨域请求!

当然,我们经常有分布式环境.但如果您的Facade在客户域上,您的曝光率会减少(单词选择可疑).

强迫黑客使用您的域名,限制他们的创造力.

4)使用第三方API尽可能频繁地维护您的访问权限: GoogleFacebook API和服务已经过单元测试,战斗测试和发展.您越依赖它们来维护用户的身份,您将完成的工作就越少,您的机会就越少.

5)检查IP地址:几乎任何东西都可以伪造,但黑客必须知道IP地址是验证的一部分.这是所有实践中最不确定的,但结合1,2或更多,黑客利用的差距变小,努力的收益逐渐减少.

6)使用"秘密"或第二个参数:您可以为用户传递多个令牌.你可以通过自己的Alter-Token.

假装它是来回传递的ID数据.以非显而易见的方式命名param.使它成为一个数字(例如年龄,身高,地址).重要的一点是,你的黑客对另一方的要求知之甚少或根本不知道!

你可以通过3个参数作为安全来抛出一个严重的猴子扳手.

7)不要提供错误消息通知黑客他们被抓住了.给出超时消息而不是"得到你!" 如果入侵者没有意识到欺诈被抓住了,他们也不会适应.


我说不够--SSL可以省去很多麻烦.

注意:我见过的所有客户端提供商都允许访问他们的API而不暴露Secret.秘密不应该暴露在客户端.

  • 客户端上公开的任何数据都可以闪烁
  • 您使用的任何加密算法都将在客户端上公开.

  • 似乎没有回答这个问题.这些都不是在浏览器中的JavaScript应用程序中正确隐藏客户端密钥的方法.Dave Syer谈到了这方面的实际解决方案(可能是一个,我认为https://spring.io/blog/2015/01/12/the-login-page-angular-js-and-spring-security-part -ii)涉及实际上暂时脱离"纯JS SPA"模式并从服务器加载"受保护"资源(具有客户机密钥的文件). (3认同)