JWT编码/解码核心JS实现

简介: 本文介绍基于 Vue 3/Nuxt 3 实现的纯前端 JWT 编码/解码工具,支持 HS/RS/PS/ES 等主流算法。核心库 `JWTHelper` 封装 Base64 URL 编解码、JWT 解析、签名生成与验证,HMAC 用 CryptoJS,RSA/ECDSA 等非对称算法调用 Web Crypto API,全程浏览器端完成,安全高效。

JWT编码/解码核心JS实现

本文将介绍基于 Vue 3 和 Nuxt 3 实现的"JWT编码/解码"工具的核心技术方案。该工具主要用于在浏览器端对 JWT(JSON Web Token)进行编码、解码和签名验证,所有处理均在前端完成。

在线工具网址:https://see-tool.com/jwt-encryptor
工具截图:
在这里插入图片描述

1. 核心库设计

我们将核心的 JWT 处理逻辑封装在一个独立的 JS 库中,采用 IIFE 模式导出到全局 window.JWTHelper

1.1 Base64 URL 编码/解码

JWT 使用 Base64 URL 安全编码,需要将标准 Base64 的 + 替换为 -/ 替换为 _,并移除填充字符 =

base64UrlEncode(str) {
   
    const base64 = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(str));
    return base64
        .replace(/\+/g, '-')
        .replace(/\//g, '_')
        .replace(/=/g, '');
}

base64UrlDecode(str) {
   
    let base64 = str.replace(/-/g, '+').replace(/_/g, '/');
    while (base64.length % 4) {
   
        base64 += '=';
    }

    try {
   
        return CryptoJS.enc.Base64.parse(base64).toString(CryptoJS.enc.Utf8);
    } catch (error) {
   
        throw new Error('Invalid Base64 URL encoding');
    }
}

1.2 JWT 解码

将 JWT token 按点号分割成三部分,分别解码 Header、Payload 和 Signature。

decode(token) {
   
    if (!token || typeof token !== 'string') {
   
        throw new Error('Invalid token');
    }

    const parts = token.split('.');
    if (parts.length !== 3) {
   
        throw new Error('Invalid JWT format. Expected 3 parts separated by dots');
    }

    try {
   
        const header = JSON.parse(this.base64UrlDecode(parts[0]));
        const payload = JSON.parse(this.base64UrlDecode(parts[1]));
        const signature = parts[2];

        return {
   
            header,
            payload,
            signature
        };
    } catch (error) {
   
        throw new Error('Failed to decode JWT: ' + error.message);
    }
}

1.3 签名创建

支持多种算法:HMAC(HS256/384/512)、RSA PKCS#1 v1.5(RS256/384/512)、RSA-PSS(PS256/384/512)、ECDSA(ES256/384/512)。

createSignature(header, payload, secret, algorithm = 'HS256') {
   
    const data = header + '.' + payload;
    const alg = algorithm.toUpperCase();

    if (alg.startsWith('HS')) {
   
        let hash;
        switch (alg) {
   
            case 'HS256':
                hash = CryptoJS.HmacSHA256(data, secret);
                break;
            case 'HS384':
                hash = CryptoJS.HmacSHA384(data, secret);
                break;
            case 'HS512':
                hash = CryptoJS.HmacSHA512(data, secret);
                break;
            default:
                throw new Error('Unsupported HMAC algorithm: ' + algorithm);
        }
        return CryptoJS.enc.Base64.stringify(hash)
            .replace(/\+/g, '-')
            .replace(/\//g, '_')
            .replace(/=/g, '');
    }

    if (alg.startsWith('RS')) {
   
        return this.createRSASignature(data, secret, alg);
    }

    if (alg.startsWith('PS')) {
   
        return this.createPSSSignature(data, secret, alg);
    }

    if (alg.startsWith('ES')) {
   
        return this.createECDSASignature(data, secret, alg);
    }

    throw new Error('Unsupported algorithm: ' + algorithm);
}

1.4 RSA 签名实现

使用 Web Crypto API 处理非对称加密算法,先将 PEM 格式的私钥导入,然后进行签名。

async createRSASignature(data, privateKeyPem, algorithm) {
   
    try {
   
        const privateKey = await this.importRSAPrivateKey(privateKeyPem);

        let hashAlg;
        switch (algorithm) {
   
            case 'RS256':
                hashAlg = 'SHA-256';
                break;
            case 'RS384':
                hashAlg = 'SHA-384';
                break;
            case 'RS512':
                hashAlg = 'SHA-512';
                break;
            default:
                throw new Error('Unsupported RSA algorithm: ' + algorithm);
        }

        const encoder = new TextEncoder();
        const dataBuffer = encoder.encode(data);
        const signatureBuffer = await crypto.subtle.sign(
            {
   
                name: 'RSASSA-PKCS1-v1_5',
                hash: {
    name: hashAlg }
            },
            privateKey,
            dataBuffer
        );

        const signatureArray = new Uint8Array(signatureBuffer);
        const signatureBase64 = btoa(String.fromCharCode.apply(null, signatureArray));
        return signatureBase64
            .replace(/\+/g, '-')
            .replace(/\//g, '_')
            .replace(/=/g, '');
    } catch (error) {
   
        throw new Error('RSA signature failed: ' + error.message);
    }
}

1.5 密钥导入

将 PEM 格式的密钥转换为 Web Crypto API 可用的 CryptoKey 对象。

async importRSAPrivateKey(pem) {
   
    const pemContents = pem
        .replace(/-----BEGIN (RSA )?PRIVATE KEY-----/, '')
        .replace(/-----END (RSA )?PRIVATE KEY-----/, '')
        .replace(/\s/g, '');

    const binaryDer = atob(pemContents);
    const binaryDerBuffer = new Uint8Array(binaryDer.length);
    for (let i = 0; i < binaryDer.length; i++) {
   
        binaryDerBuffer[i] = binaryDer.charCodeAt(i);
    }

    return await crypto.subtle.importKey(
        'pkcs8',
        binaryDerBuffer,
        {
   
            name: 'RSASSA-PKCS1-v1_5',
            hash: {
    name: 'SHA-256' }
        },
        false,
        ['sign']
    );
}

1.6 JWT 编码

将 Header、Payload 编码后创建签名,组合成完整的 JWT token。

async encode(payload, secret, algorithm = 'HS256') {
   
    if (!secret) {
   
        throw new Error('Secret key is required');
    }

    if (typeof payload !== 'object' || payload === null) {
   
        throw new Error('Payload must be an object');
    }

    const header = {
   
        alg: algorithm.toUpperCase(),
        typ: 'JWT'
    };

    const encodedHeader = this.base64UrlEncode(JSON.stringify(header));
    const encodedPayload = this.base64UrlEncode(JSON.stringify(payload));

    const signature = await this.createSignature(encodedHeader, encodedPayload, secret, algorithm);

    return encodedHeader + '.' + encodedPayload + '.' + signature;
}

1.7 签名验证

验证 JWT 签名的有效性,支持所有算法类型。

async verify(token, secret) {
   
    if (!token || !secret) {
   
        return false;
    }

    try {
   
        const parts = token.split('.');
        if (parts.length !== 3) {
   
            return false;
        }

        const header = JSON.parse(this.base64UrlDecode(parts[0]));
        const algorithm = header.alg;
        const data = parts[0] + '.' + parts[1];

        if (algorithm.startsWith('RS')) {
   
            return await this.verifyRSASignature(data, parts[2], secret, algorithm);
        }

        if (algorithm.startsWith('PS')) {
   
            return await this.verifyPSSSignature(data, parts[2], secret, algorithm);
        }

        if (algorithm.startsWith('ES')) {
   
            return await this.verifyECDSASignature(data, parts[2], secret, algorithm);
        }

        const expectedSignature = this.createSignature(parts[0], parts[1], secret, algorithm);
        return parts[2] === expectedSignature;
    } catch (error) {
   
        console.error('Verification error:', error);
        return false;
    }
}

2. Vue 组件集成

在 Vue 组件中,通过动态脚本加载核心库和 crypto-js,然后使用 window.JWTHelper 进行编码和解码操作。

const decodeJWT = async () => {
   
    const token = jwtInput.value.trim()
    if (!token) {
   
        headerOutput.value = ''
        payloadOutput.value = ''
        signatureOutput.value = ''
        signatureStatus.value = ''
        return
    }
    try {
   
        const decoded = jwtHelper.decode(token)
        headerOutput.value = formatJSON(decoded.header)
        payloadOutput.value = formatJSON(decoded.payload)
        signatureOutput.value = decoded.signature

        if (verifySignature.value && secretKey.value) {
   
            const isValid = await jwtHelper.verify(token, secretKey.value)
            signatureStatus.value = isValid ? 'valid' : 'invalid'
        } else {
   
            signatureStatus.value = ''
        }
    } catch (error) {
   
        headerOutput.value = error.message
        payloadOutput.value = ''
        signatureOutput.value = ''
        signatureStatus.value = ''
    }
}

const encodeJWT = async () => {
   
    try {
   
        const payload = JSON.parse(payloadInput.value || '{}')
        const token = await jwtHelper.encode(payload, secretKey.value, encodeAlgorithm.value)
        jwtOutput.value = token
    } catch (error) {
   
        jwtOutput.value = error.message
    }
}

总结

该方案的核心在于通过 jwt-helper.js 封装纯粹的 JWT 处理逻辑,结合 CryptoJS 处理 HMAC 算法,利用 Web Crypto API 处理非对称加密算法(RSA、ECDSA),实现了一个功能完善的纯前端 JWT 编码/解码工具。

相关文章
|
24天前
|
运维 安全 数据安全/隐私保护
Xftp-7.0.0109p文件传输安装步骤详解(附FTP/SFTP连接与文件传输教程)
Xftp 7.0.0109p 是一款轻量易用的FTP/SFTP文件传输工具,界面类似资源管理器,支持拖拽传文件。适用于网站运维、开发联调及VPS管理。安装简单,支持自定义路径与桌面快捷方式,首次运行可快速配置FTP/SFTP连接,实现本地与服务器间高效文件交互。(239字)
|
21天前
|
编解码 atlas ice
MEaSUREs 格陵兰冰盖测绘项目(GrIMP)基于 GeoEye 和 WorldView 影像的数字高程模型 V002
MEaSUREs格陵兰冰绘图计划(GrIMP)V002 DEM,基于GeoEye与WorldView系列卫星亚米级立体影像生成,空间分辨率高,经ICESat-2 ATL06数据精校准,适用于冰盖高程变化研究。(239字)
124 15
|
24天前
|
JSON 算法 安全
JWT编码解码 在线工具分享
一款基于Vue3开发的轻量级JWT在线编码/解码工具,支持HS256/RS256/ES256等主流算法,自动解析Header/Payload/Signature三部分并高亮显示,内置签名验证与示例一键加载功能。全程本地运算,密钥不上传,安全高效,调试开发更便捷。
438 3
JWT编码解码 在线工具分享
|
21天前
|
人工智能 监控 安全
OpenClaw/Clawdbot实战攻略:3步部署+3大核心skills+5个颠覆级案例,实现“聊天框里办大事”
2026年初,一只名叫Molty的“小龙虾”席卷全球科技圈——OpenClaw(原Clawdbot、Moltbot)以72小时狂揽60,000+ GitHub Stars的速度爆红,如今星标数已突破180,000+,不仅让Mac Mini全球卖断货,更带动Cloudflare股价上涨20%。它绝非普通聊天机器人,而是“长了手的AI助理”,能通过Telegram、飞书等10+渠道主动执行任务,从网站重建、买车砍价到Bug修复,真正实现“聊天框里办大事”。
811 19
|
24天前
|
数据采集 人工智能 算法
2026 年,医疗机构继续重仓“竞价排名”是否理性?——从技术视角看医疗GEO与数字信誉资产
2026年,AI生成式搜索重构医疗流量逻辑:单纯依赖“竞价排名”已成技术错配。本文从数据治理与合规工程出发,提出“医疗GEO”(生成式引擎优化)新范式——以知识图谱、资质核验、循证校验构建可被大模型信任的数字信誉资产,推动行业从流量采购迈向信誉工程。(239字)
115 14
|
17天前
|
存储 JavaScript 前端开发
URL编码/解码 核心JS实现
这是一款基于Vue开发的轻量级URL编码/解码在线工具,纯前端实现,无需依赖外部库。利用`encodeURI`/`encodeURIComponent`及对应解码方法,支持一键编码、解码、清空与复制,并自动聚焦输入框,提升使用效率。
221 3
|
24天前
|
数据库 Python
15 分钟用 FastMCP 搭建你的第一个 MCP Server(附完整代码)
Model Context Protocol(MCP)是一个轻量开放标准,让LLM能统一、可靠地调用外部工具。无需手写解析逻辑或维护胶水代码。核心仅三概念:Server(暴露工具)、Tool(带装饰器的函数)、Client(调用方)。FastMCP框架15分钟即可上手,支持stdio快速测试、HTTP生产部署,真正实现“写一次,随处调用”。
146 3
15 分钟用 FastMCP 搭建你的第一个 MCP Server(附完整代码)
|
1天前
|
人工智能 JavaScript Linux
【最新版养 AI龙虾🦞指南】零基础 OpenClaw 阿里云/本地部署、配置、使用保姆级教程
OpenClaw(原Clawdbot,曾用名Moltbot)作为一款开源轻量级AI自动化代理工具,2026年版本在部署灵活性、功能兼容性上实现重大升级,核心优势在于“自然语言驱动+全流程任务自动化”,无需手动编写脚本,仅需输入口语化指令,即可完成文档处理、日程管理、文件读写、跨工具协同、代码生成等各类重复性工作,被广泛应用于个人办公、新手开发、轻量团队协作等场景,堪称“私人AI员工”。
176 15
|
3天前
|
存储 人工智能 自然语言处理
OpenClaw快速上手指南:基础介绍+部署教程+进阶玩法
OpenClaw(原名Clawdbot/Moltbot)是2026年热门的开源AI智能体,其核心特性是“能动手干活”,而不仅仅是聊天。它支持本地或云端部署,能通过自然语言指令直接操作文件系统、浏览器、邮件及代码,实现自动化办公与开发任务。阿里云提供了一键部署方案,建议新手优先选择云端部署以保障数据安全,并注意配置API密钥及端口权限等常见问题。
599 13
|
1月前
|
编解码 JavaScript 安全
二维码生成器 在线工具分享
一款基于Vue开发的在线二维码生成器,无需安装、不传数据,所有操作在浏览器本地完成。支持网址、文本、电话等多类型内容,实时预览、自定义尺寸/容错/颜色,一键下载高清图。隐私安全,手机电脑皆可用。
259 13

热门文章

最新文章