使用具有静态jwt令牌的Api服务器的安全应用

时间:2018-12-22 21:50:52

标签: api express single-page-application

可能有人问过这个问题,但也许2018年会有更好的方法。我正在尝试保护我的api服务器,并仅授予对我创建的客户端应用程序的访问权限。使用vue.js的客户端应用程序以及在api服务器的节点上使用express.js的移动/ Web客户端应用程序。

明智的做法是在客户端应用程序中创建一个静态令牌代码。它将随每个api调用一起发送。然后在api服务器上将我的密码保密。在可以回传api调用之前,请验证令牌。

有更好的方法吗?似乎工作正常,但也许有些我不知道的东西。也许每隔一段时间就会替换静态令牌和机密吗?该网络肯定是https。我通过每个api调用req.body.clientAppToken

发送令牌

您怎么看?谢谢大家!

更新以下是Express api中间件。

App会在每次请求时将手动创建的令牌发送到api服务器。所有应用程序的令牌均相同。我用存储在服务器上的密码验证令牌。如果通过,他们将获得数据;否则,他们将不会。

const jwt = require('jsonwebtoken')
const config = require('../config/config')

module.exports = {
  authClientAppToken (req, res, next) {
    // start see if client app jwt is correct
    /* eslint-disable */
    console.log('req.body.clientAppToken', req.body.clientAppToken)
    try {
        let decoded = jwt.verify(req.body.clientAppToken, config.jwtAppSecret)
        next()
    } catch (err) {
        res.status(400).send({
            error: 'We got problems'
        })
    }
    /* eslint-enable */
    // end see if client app jwt is correct
  }
}

1 个答案:

答案 0 :(得分:0)

  

我正在尝试保护自己的api服务器,并仅授予对我创建的客户端应用程序的访问权限。移动/ Web客户端应用程序将vue.js用于客户端应用程序,将express.js使用api服务器上的节点。

这里的残酷事实是,您无法真正保护Web应用程序的安全,因为在Web上可以很容易地检索到任何秘密,例如JWT令牌,签名的JWT令牌,API密钥或其他任何您想使用的秘密。客户端,只需使用浏览器开发人员工具(也称为F12)即可。

在移动应用程序上,开发人员可能会认为,一旦他们将二进制文件运送到那里就可以在其中隐藏秘密并保持安全,那么移动应用程序看起来并不像在浏览器中使用F12那样琐碎,但是它们很容易使用Mobile Security Framework之类的工具进行逆向工程,它将提取二进制文件中的所有代码,从而公开存储在二进制文件中的所有秘密。但是,即使秘密是在运行时计算出来的,该工具也能够对移动应用程序的运行情况进行运行时自省,从而能够提取动态计算出的秘密。

  

明智的做法是在客户端应用程序中创建一个静态令牌代码。它将随每个api调用一起发送。然后在api服务器上将我的密码保密。在可以回传api调用之前,请验证令牌。

因此,如前所述,在客户端生成或存储的任何机密都可以在预期范围之外进行提取和重新使用。尽管如此,我仍然鼓励将它们用作防御的另一层。

  

它似乎工作正常,但是也许有些我不知道的东西。

我建议您通过this series of articles的Mobile Api Security技术来了解如何使用https,证书固定,api密钥,令牌,HMAC来保护API服务器以及如何绕过它们。虽然本文是在移动api的上下文中进行的,但几乎所有内容都适用于为网络应用提供服务的API的上下文。

  

也许每隔一段时间就会替换静态令牌和机密吗?

在令牌上使用较短的有效期是明智的建议,但它们只是使可以被恶意重用的窗口变短了,但不能防止API滥用。

  

网络肯定是https。

虽然https始终应始终使用https,但只能保证传输中的数据已加密且不能被第三方读取,从而保护了传输中的秘密,但不会阻止从应用程序本身对其进行反向工程。

  

有更好的方法吗?

对于Web应用程序,您可以使用javascript obfuscation tool,实施reCaptcha V3来解决这个问题,如果您想在API服务器上更高级地使用User Behavior Analytics软件解决方案。

关于移动应用程序,可以以不需要在其中存储机密信息的方式来构建它们,以便在每次调用时传递给API服务器。该技术称为“移动应用证明”,由移动sdk和云服务共同组成,以确保该移动应用与上传到Google Play或App Store的应用相同。移动sdk在后台运行,并与云服务进行通信,当该应用是原始应用且未在越狱或生根的设备中运行,或在中间攻击中成为人的对象时,该云服务将发出有效的JWT令牌。有效的JWT令牌是由仅由云服务和API服务器知道的秘密签名的,移动应用程序随时都不知道,因此无法对其进行反向工程或伪造。无效的JWT令牌与有效令牌的区别仅在于,它使用API​​服务器不知道的秘密进行了签名,从而使其与有效令牌无法区分。可以在Approov找到这种类型的安全解决方案,这是我目前正在工作的地方。