我正在开发一个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
});
如果我尝试对此进行解码,那么我将无法立即检索到用户名。那是不安全的。
我对此进行了很多研究,进行了很多讨论,但我不明白为什么当时会有那么多应用程序使用它。在安全性或如何使它成为一个更好的系统方面,我一定缺少一些东西。如果没有,我是否应该使用其他系统来验证用户名和密码并保持登录状态?
答案 0 :(得分:0)
使JWT安全的部分是签名。 JWT包含三个部分:
以下是https://jwt.io/introduction/中的引号:
要创建签名部分,您必须使用编码的标头, 编码的有效载荷,机密,标头中指定的算法以及 签名。
例如,如果要使用HMAC SHA256算法,则 签名将通过以下方式创建:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
签名用于验证邮件在发送过程中未更改 方式,并且对于使用私钥签名的令牌,它还可以 验证JWT的发件人是谁。