JWT Encoder

使用HS256、HS384、HS512创建和签署JSON Web令牌

头部

本地运行 · 粘贴密钥安全无忧

有效负载

本地运行 · 粘贴密钥安全无忧

密钥

本地运行 · 粘贴密钥安全无忧

编码的JWT

Output will appear here…

您的密钥永远不会离开浏览器。所有签名都在客户端进行。

也可以试试:JWT解码工具

什么是JWT编码?

JWT编码是创建JSON Web Token的过程——一种紧凑、URL安全的字符串,包含用密钥签名的声明集合。结果是由RFC 7519定义的三部分令牌(头.有效负载.签名),服务器可以验证而无需维护会话状态。在线JWT编码允许你直接在浏览器中创建和签署令牌,用于测试和开发。

头部声明签名算法(如HS256)和令牌类型。有效负载包含声明——键值对,如主体(sub)、过期时间(exp)和应用程序需要的任何自定义数据。两部分都序列化为JSON,然后进行base64url编码。签名使用秘密密钥计算编码的头和有效负载,将所有三个部分绑定在一起。

与会话cookie不同,JWT是自包含的:验证者无需查询数据库或调用外部服务。这使得基于JWT的认证在REST API、微服务和单页应用中很流行,其中无状态授权降低延迟并简化水平扩展。

为什么使用JWT编码器?

手动生成JWT需要base64url编码、JSON序列化和HMAC计算。该工具立即处理所有三个步骤,让你专注于获取正确的声明。

即时令牌生成
编辑头、有效负载和秘密——签署的JWT实时更新。无需构建步骤、无需库安装、无需模板代码。
🔒
多个HMAC算法
一键在HS256、HS384和HS512之间切换。头自动更新,签名立即重新计算。
🛡️
隐私优先处理
所有签名都在浏览器中使用Web Crypto API进行。你的秘密密钥和有效负载数据永远不会离开你的机器——无服务器、无日志、无风险。
📋
一键声明助手
用一个按钮添加iat、exp+1h或exp+24h时间戳。无需手动计算Unix时间戳或查找当前纪元时间。

JWT编码器用例

前端认证测试
生成具有特定声明和过期时间的令牌,以测试登录流程、令牌刷新逻辑和受保护路由,无需运行后端认证服务器。
后端API开发
创建具有自定义sub、aud和scope声明的测试令牌,以在本地开发期间练习授权中间件、基于角色的访问控制和权限检查。
DevOps和CI/CD管道
为部署脚本、集成测试或服务间通信生成短期令牌,其中完整的OAuth流将增加不必要的复杂性。
质量保证和手动测试
构建具有边界情况声明的令牌——过期令牌、缺失字段、错误的受众——以验证你的API返回正确的HTTP 401或403响应。
安全审计
创建用不同算法和秘密长度签署的令牌,以验证你的验证逻辑正确拒绝弱的或不匹配的签名。
学习与原型设计
JWT的学生和新开发人员可以尝试头字段、声明结构和签名算法,以了解令牌的每个部分如何工作。

HS256 vs HS384 vs HS512:HMAC算法比较

三种算法都使用HMAC(基于哈希的消息认证码)与共享秘密。不同之处在于底层哈希函数,它影响签名长度和安全裕度。对于大多数应用程序,HS256提供足够的安全性。当合规要求(如FIPS-140)要求更强的哈希,或你的令牌涉及高价值授权决策时,选择HS384或HS512。

算法哈希签名速度典型用途
HS256SHA-25632 BFastestGeneral purpose, default for most libraries
HS384SHA-38448 BFastHigher security margin, FIPS-140 compliant
HS512SHA-51264 BFastMaximum HMAC security, large payloads

标准JWT声明参考

RFC 7519定义七个注册声明。没有一个是必需的,但正确使用可以改进互操作性和安全性。exp声明特别重要——没有过期日期的令牌如果秘密未轮换,则无限期有效。

声明名称描述示例
issIssuerWho issued the token"auth.example.com"
subSubjectWho the token represents"user-123"
audAudienceIntended recipient service"api.example.com"
expExpirationUnix timestamp — token invalid after this time1717203600
nbfNot BeforeUnix timestamp — token invalid before this time1717200000
iatIssued AtUnix timestamp when the token was created1717200000
jtiJWT IDUnique token identifier for revocation tracking"a1b2c3d4"

代码中的JWT编码

这些示例显示如何以编程方式创建和签署JWT。每个片段都生成有效的HS256签署令牌。对于生产系统,始终设置exp声明并使用至少256位的密码安全秘密。

JavaScript (Web Crypto API)
async function signJWT(payload, secret, alg = 'HS256') {
  const header = { alg, typ: 'JWT' }
  const enc = new TextEncoder()

  // Base64url encode header and payload
  const b64url = (obj) =>
    btoa(JSON.stringify(obj)).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '')

  const h = b64url(header)
  const p = b64url(payload)

  // Sign with HMAC-SHA256
  const key = await crypto.subtle.importKey(
    'raw', enc.encode(secret),
    { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']
  )
  const sig = await crypto.subtle.sign('HMAC', key, enc.encode(`${h}.${p}`))
  const s = btoa(String.fromCharCode(...new Uint8Array(sig)))
    .replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '')

  return `${h}.${p}.${s}`
}

// Usage
const token = await signJWT(
  { sub: 'user-123', name: 'Alice', iat: Math.floor(Date.now() / 1000) },
  'your-256-bit-secret'
)
// → "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOi..."
Python (PyJWT)
import jwt
import time

payload = {
    "sub": "user-123",
    "name": "Alice",
    "iat": int(time.time()),
    "exp": int(time.time()) + 3600,  # expires in 1 hour
}

# Sign with HS256 (default)
token = jwt.encode(payload, "your-256-bit-secret", algorithm="HS256")
# → "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOi..."

# Verify and decode
decoded = jwt.decode(token, "your-256-bit-secret", algorithms=["HS256"])
# → {"sub": "user-123", "name": "Alice", "iat": 1717200000, "exp": 1717203600}
Node.js (jsonwebtoken)
const jwt = require('jsonwebtoken')

const payload = {
  sub: 'user-123',
  name: 'Alice',
  role: 'admin',
}

// Sign — iat is added automatically
const token = jwt.sign(payload, 'your-256-bit-secret', {
  algorithm: 'HS256',
  expiresIn: '1h',    // sets exp claim
  issuer: 'auth.example.com',  // sets iss claim
})

// Verify
const decoded = jwt.verify(token, 'your-256-bit-secret')
// → { sub: 'user-123', name: 'Alice', role: 'admin', iat: ..., exp: ... }
Go (golang-jwt)
package main

import (
    "fmt"
    "time"
    "github.com/golang-jwt/jwt/v5"
)

func main() {
    claims := jwt.MapClaims{
        "sub":  "user-123",
        "name": "Alice",
        "iat":  time.Now().Unix(),
        "exp":  time.Now().Add(time.Hour).Unix(),
    }

    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
    signed, _ := token.SignedString([]byte("your-256-bit-secret"))
    fmt.Println(signed)
    // → eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOi...
}

常见问题

JWT编码和JWT解码之间有什么区别?
JWT编码从头、有效负载和秘密密钥创建签署的令牌。JWT解码反转该过程——它将base64url编码的头和有效负载读回JSON。解码不需要秘密;编码总是需要,因为签名必须被计算。
我的JWT秘密密钥应该有多长?
对于HS256,使用至少256位(32字节)的秘密。对于HS384,使用至少384位(48字节)。对于HS512,使用至少512位(64字节)。较短的秘密在技术上被大多数库接受,但降低HMAC签名的有效安全性。使用密码学安全的随机生成器生成秘密,而不是人工选择的密码。
使用真实秘密使用此工具是否安全?
此工具使用Web Crypto API在浏览器中处理所有内容——没有数据发送到任何服务器。话虽如此,作为一般安全实践,避免将生产秘密粘贴到任何网络工具中。对于生产密钥管理,使用环境变量或秘密管理器,如HashiCorp Vault或AWS Secrets Manager。
我应该为我的应用程序使用HS256还是RS256?
当同一服务创建和验证令牌时使用HS256——它更快、更简单。当第三方服务需要验证你的令牌而无法创建它们时,使用RS256(非对称)。RS256常见于OAuth 2.0提供者、OpenID Connect和多租户SaaS架构。
为什么我的JWT在创建后立即过期?
exp声明使用Unix时间戳,以秒为单位,而不是毫秒。如果将exp设置为Date.now()(返回毫秒),令牌将在未来数千年内过期——或者如果意外使用毫秒值而期望秒,库可能会将其解释为已经过期。始终在JavaScript中使用Math.floor(Date.now() / 1000)或在Python中使用int(time.time())。
我可以在JWT有效负载中放置敏感数据吗?
你可以,但不应该。JWT有效负载是base64url编码的,而不是加密的——任何有令牌的人都可以读取声明。不要在有效负载中存储密码、信用卡号或个人数据。如果必须包括敏感信息,使用RFC 7516中定义的JWE(JSON Web Encryption),它加密整个有效负载。
如果我在签署后更改有效负载会发生什么?
签名变得无效。HMAC签名是在编码的头和有效负载的确切字节上计算的。任何变化——甚至添加空格或更改单个字符——都会产生完全不同的签名。正确实现的验证者将拒绝该令牌,出现签名不匹配错误。