2016-04-28 73 views
0

可以说,我创建令牌像这样: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,以确定谁发送一次身份验证的邮件用户。这种识别哪些用户发送消息的方法有多安全?如何伪造令牌并冒充用户?只知道密钥?有什么方法可以用来破解这种安全形式?我如何确保选择的安全方法是安全的?

回答

3

一个JWT具有这样 XXXX是信头信息 YYYYY是有效载荷 ZZZZZ与您的安全密钥的有效载荷的哈希格式XXXXX.YYYYY.ZZZZZ。

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

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