在iOS Swift应用中使用JWT真的安全吗?

时间:2019-01-17 20:56:06

标签: node.js security authentication jwt

我正在开发一个iOS应用程序,该应用程序要求用户能够登录,注册帐户并注销。

在应用程序中,登录后,他们可以执行各种操作。但这现在(真的)无关紧要。我使用Node.js作为后端,并且在凭据正确的情况下正在发送回JSON Web令牌(JWT)。现在我只是想知道这是否真的安全。.

上周,我一直在Internet上四处寻找建立基于用户名和密码的身份验证系统的最安全方法。我使用bcrypt将密码存储在MySQL数据库中。匹配它们可以很好地工作,因此我实际上可以登录-但我想生成一个密钥以供以后访问,这样用户不必登录他所访问的每个页面。

JWT似乎是一个不错的选择,但是我越了解它,就越相信它不如我希望的那样安全。毕竟,我不希望有人检索JSON Web令牌,将其更改为其他名称,然后突然可以访问他人的帐户。

我如何使用JWT的示例如下所示:

const payload = {
    userName: rows[0].userName
};

var token = jwt.sign(payload, secret, {
    // expiresInMinutes: 1440
});

如果我尝试对此进行解码,那么我将无法立即检索到用户名。那是不安全的。

我对此进行了很多研究,进行了很多讨论,但我不明白为什么当时会有那么多应用程序使用它。在安全性或如何使它成为一个更好的系统方面,我一定缺少一些东西。如果没有,我是否应该使用其他系统来验证用户名和密码并保持登录状态?

1 个答案:

答案 0 :(得分:0)

使JWT安全的部分是签名。 JWT包含三个部分:

  • 标题
  • 有效载荷
  • 签名

以下是https://jwt.io/introduction/中的引号:

  

要创建签名部分,您必须使用编码的标头,   编码的有效载荷,机密,标头中指定的算法以及   签名。

     

例如,如果要使用HMAC SHA256算法,则   签名将通过以下方式创建:

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)
     

签名用于验证邮件在发送过程中未更改   方式,并且对于使用私钥签名的令牌,它还可以   验证JWT的发件人是谁。