【问题标题】:Does JWT Authorization entirely depend upon the secret key?JWT 授权是否完全依赖于密钥?
【发布时间】:2022-08-02 10:45:40
【问题描述】:

据我了解智威汤逊可以分解为标题,有效载荷和一个签名.这签名是使用创建的标题+有效载荷+秘密.这秘密由存储服务器并且从不共享。

当一个客户发送一个智威汤逊服务器.这服务器可以通过访问授权它标题,有效载荷从......收到智威汤逊并将其与秘密创建一个测试签名.然后服务器可以检查是否测试签名=签名从收到客户 智威汤逊并确保数据未被更改。

• 这是否意味着整个智威汤逊授权取决于秘密如果泄漏,整个授权过程会受到损害吗?

  • 是的。 (还有 10 个字符,所以我实际上可以添加此评论。:))

标签: authentication security jwt


【解决方案1】:

秘密很重要验证智威汤逊

此图是使用 JWT 通过 API 调用访问资源的正常顺序。

我想用真实的代码进行演示。

在 node-js 上使用 jsonwebtoken javascript 库

1. JWT 生成步骤。函数名称:生成令牌()

第一个函数参数:秘密

第二个函数参数:用户名(或有效载荷)

const jwt = require("jsonwebtoken")

const jwtExpirySeconds = 600

const generate_token = (jwtKey, username) => {
    const token = jwt.sign({ username }, jwtKey, {
        algorithm: "HS256",
        expiresIn: jwtExpirySeconds,
    })
    console.log("JWT token:", token, '\n')
    const [header, payload, signature] = token.split(".")
    console.log("1) header:", header)
    console.log(JSON.parse(Buffer.from(header, "base64").toString("utf8")), '\n')
    console.log("2) payload:", payload)
    console.log(JSON.parse(Buffer.from(payload, "base64").toString("utf8")), '\n')
    console.log("3) signature:", signature)
}
const my_args = process.argv.slice(2);
generate_token(my_args[0], my_args[1]);

生成带有密码和用户名的令牌

node generate_token.js my-secret user1

结果在终端

$ node generate_token.js my-secret user1
JWT token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InVzZXIxIiwiaWF0IjoxNjU5NDA3NzQ0LCJleHAiOjE2NTk0MDgzNDR9.MMIxotVJjMBLFOg0nusePz4L62n7VZ4Q-fW_u392qDQ

1) header: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
{ alg: 'HS256', typ: 'JWT' }

2) payload: eyJ1c2VybmFtZSI6InVzZXIxIiwiaWF0IjoxNjU5NDA3NzQ0LCJleHAiOjE2NTk0MDgzNDR9
{ username: 'user1', iat: 1659407744, exp: 1659408344 }

3) signature: MMIxotVJjMBLFOg0nusePz4L62n7VZ4Q-fW_u392qDQ

2.验证JWT步骤。函数名:verify_token()

第一个函数参数:秘密

第二个函数参数:智威汤逊令牌

const jwt = require("jsonwebtoken")

const verify_token = (jwtKey, token) => {
    try {
        payload = jwt.verify(token, jwtKey)
        console.log("JWT token verify:", payload, '\n')
    } catch (e) {
        if (e instanceof jwt.JsonWebTokenError) {
            console.log("JWT token error: 401")
            return
        }
        // otherwise, return a bad request error
        console.log("JWT token error: 400")
    }
}
const my_args = process.argv.slice(2);
verify_token(my_args[0], my_args[1]);

2.1 验证令牌正确的秘密和 JWT 令牌

 node verify_token.js my-secret  eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InVzZXIxIiwiaWF0IjoxNjU5NDA3NzQ0LCJleHAiOjE2NTk0MDgzNDR9.MMIxotVJjMBLFOg0nusePz4L62n7VZ4Q-fW_u392qDQ

结果在终端

$ node verify_token.js my-secret  eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InVzZXIxIiwiaWF0IjoxNjU5NDA3NzQ0LCJleHAiOjE2NTk0MDgzNDR9.MMIxotVJjMBLFOg0nusePz4L62n7VZ4Q-fW_u392qDQ
JWT token verify: { username: 'user1', iat: 1659407744, exp: 1659408344 }

2.2 if 验证令牌错误的秘密和相同的 JWT 令牌

node verify_token.js wrong-secret  eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InVzZXIxIiwiaWF0IjoxNjU5NDA3NzQ0LCJleHAiOjE2NTk0MDgzNDR9.MMIxotVJjMBLFOg0nusePz4L62n7VZ4Q-fW_u392qDQ

结果在终端

JWT token error: 401

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-13
    相关资源
    最近更新 更多