签署从前端到后端的 api 调用
Posted
技术标签:
【中文标题】签署从前端到后端的 api 调用【英文标题】:signing api calls from frontend to backend 【发布时间】:2018-04-01 07:18:09 【问题描述】:我正在为前端使用密钥实现与后端通信的安全方式。后端是一项敏感服务(手机银行)。
首先我想到的是 JWT,但基于令牌的方法有两个缺点:
a) 前端必须获得令牌,这意味着它必须向后端发送一些身份验证数据 - 如果前端可以这样做,任何人都可以这样做。
b) 即使有某种安全的方式来获取令牌,任何人都可以启动 Chrome 开发工具并在它未过期的情况下使用它。
因此,另一种方法是使用密钥对来自前端的每个请求进行签名。密钥是后端已知的,前端是经过捆绑和丑化的,以保持密钥的秘密。我们连接请求 URL 及其有效负载,使用密钥对其进行加密,并将生成的哈希发送到标头中。后端获取请求,进行相同的加密并比较标头;如果它们相等 - 它会提出请求。
这引出了三个问题:
这是否真的意味着即使请求被嗅探也无法复制,除非url+payload相同?我有什么遗漏吗?
是否有实现这种方法的 JS 库? (或者也可能是后端的东西 - 我正在使用 Django)
有更好的方法吗?
【问题讨论】:
这不是一种特别安全的方法:这是通过混淆实现的安全性。虽然钥匙通过丑化隐藏在前端,但只要努力了,还是可以找到的…… 与其推出自己的解决方案,不如考虑使用一些久经考验的方法,例如 OAuth。前端和后端都有可用的库/工具包(Django OAuth Toolkit) JWT 完全按照您想要重新创建的方式执行,但方式更加安全。如果您的秘密在客户端,那么弄清楚它是微不足道的。 【参考方案1】:随心所欲地捆绑,如果您授权请求的安全密钥在 js 中,我将能够取消丑化(美化)并获取它。使用 SSL 加密连接,只使用 JWT ;)
http://jsbeautifier.org/
无论如何,您都必须以某种方式授权用户,因此这意味着发送私人数据以建立“会话”。让它成为用户名、电子邮件、密码或一些“秘密”令牌。
【讨论】:
以上是关于签署从前端到后端的 api 调用的主要内容,如果未能解决你的问题,请参考以下文章