MST

星途 面试题库

面试题:安全认证之JWT签名算法实践

假设你正在使用HMAC SHA256算法对JWT进行签名,在实际代码实现中(请选择你熟悉的一种后端开发语言,如Python、Java、Node.js等),简述从生成令牌到验证令牌签名的关键步骤和代码片段。
10.4万 热度难度
后端开发安全认证

知识考点

AI 面试

面试题答案

一键面试

使用Python实现

  1. 安装依赖
    • 首先确保安装了PyJWT库,可使用pip install PyJWT安装。
  2. 生成令牌
import jwt
import datetime

# 密钥,需妥善保管
SECRET_KEY = "your_secret_key"

def generate_token(user_id):
    payload = {
        'user_id': user_id,
        'exp': datetime.datetime.utcnow() + datetime.timedelta(minutes = 30)  # 令牌过期时间
    }
    token = jwt.encode(payload, SECRET_KEY, algorithm='HS256')
    return token
  1. 验证令牌签名
def verify_token(token):
    try:
        data = jwt.decode(token, SECRET_KEY, algorithms=['HS256'])
        return data
    except jwt.ExpiredSignatureError:
        return None
    except jwt.InvalidTokenError:
        return None

使用Java实现

  1. 添加依赖
    • pom.xml中添加jjwt-apijjwt-impl依赖。
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-api</artifactId>
    <version>0.11.2</version>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-impl</artifactId>
    <version>0.11.2</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-jackson</artifactId>
    <version>0.11.2</version>
    <scope>runtime</scope>
</dependency>
  1. 生成令牌
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;

import java.security.Key;
import java.util.Date;

public class JwtUtil {
    private static final Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256);
    private static final long EXPIRATION_TIME = 30 * 60 * 1000; // 30分钟

    public static String generateToken(String userId) {
        Date expiration = new Date(System.currentTimeMillis() + EXPIRATION_TIME);
        Claims claims = Jwts.claims().setSubject(userId);
        claims.put("exp", expiration);
        return Jwts.builder()
               .setClaims(claims)
               .signWith(key, SignatureAlgorithm.HS256)
               .compact();
    }
}
  1. 验证令牌签名
public static boolean verifyToken(String token) {
    try {
        Jwts.parserBuilder()
               .setSigningKey(key)
               .build()
               .parseClaimsJws(token);
        return true;
    } catch (Exception e) {
        return false;
    }
}

使用Node.js实现

  1. 安装依赖
    • 使用npm install jsonwebtoken安装jsonwebtoken库。
  2. 生成令牌
const jwt = require('jsonwebtoken');

const SECRET_KEY = 'your_secret_key';

function generateToken(userId) {
    const payload = {
        user_id: userId,
        exp: Math.floor(Date.now() / 1000) + (30 * 60) // 30分钟过期
    };
    return jwt.sign(payload, SECRET_KEY, { algorithm: 'HS256' });
}
  1. 验证令牌签名
function verifyToken(token) {
    try {
        const decoded = jwt.verify(token, SECRET_KEY);
        return decoded;
    } catch (err) {
        return null;
    }
}