如何通过JWT编码实现安全性?

时间:2016-04-28 12:24:12

标签: security encryption socket.io jwt

让我说我创建一个这样的标记:

def create_token(userId):
    payload = {
        # subject
        'sub': userId,
        #issued at
        'iat': datetime.utcnow(),
        #expiry
        'exp': datetime.utcnow() + timedelta(days=1)
    }

    token = jwt.encode(payload, SECRET_KEY, algorithm='HS256')
    return token.decode('unicode_escape')

节点socket.io

io.sockets
    .on('connection', socketioJwt.authorize({
        secret: 'SOME SECRET',
        timeout: 15000
    }))
    .on('authenticated', function(socket) {
        console.log('hello! ', socket.decoded_token);

        socket.on('message', function(message) {
            console.log(message);
            io.emit('message', message);
        });
    })
    .on('error', function(error) {
        console.log(error.type);
        console.log(error.code);
    });

现在,我将使用用户ID来识别经过身份验证后发送邮件的用户。这种识别哪些用户发送邮件的方法有多安全?伪造一个令牌并冒充用户需要什么?只知道密钥?有什么方法可以用来破解这种安全形式?我如何确保这种安全的安全方法是安全的?

1 个答案:

答案 0 :(得分:4)

JWT的格式为XXXXX.YYYYY.ZZZZZ XXXX是标题信息 YYYYY是有效载荷 ZZZZZ是带有安全密钥的有效负载的哈希值。

由于JWT只是Base64编码,任何人都可以解码JWT并查看有效负载。但是,如果它们更改了值,则有效负载将不会散列到与ZZZZZ相同的值,因此令牌将变为无效。此方法使令牌安全不被篡改(只要没有其他人具有用于签署令牌的安全密钥)。但是,由于任何人都可以读取令牌,因此任何不应该可见的敏感数据都不应包含在有效负载中或加密。

要伪造令牌,或者篡改令牌并更改用户ID,黑客就需要您的安全密钥。