📅  最后修改于: 2023-12-03 14:49:57.583000             🧑  作者: Mango
JSON Web Tokens (JWTs) 是现代 Web 应用程序中常用的认证机制。它们提供了一种安全的方式,让应用程序在不需要再次进行身份验证的情况下识别用户。
使用 JWTs,我们可以在用户登录时将一个 token 返回给客户端。该 token 包含有关用户身份的信息,例如用户 ID 和角色。客户端将在以后的所有 API 请求中使用此 token,以验证其身份并获得相应的响应。
但是,JWTs 只有在部署正确的加密机制后才能被认为是安全的。否则,他们的负载可以被拦截和修改。
下面是如何使用 Node.js 和 cryptography 库创建安全的 JWT 密钥的步骤:
npm install --save cryptography
使用下面的命令创建 RSA 密钥对:
openssl genrsa -out private.pem 2048
openssl rsa -in private.pem -pubout > public.pem
这将生成一个私钥文件 private.pem 和一个公钥文件 public.pem 。私钥存储在服务器端,用于对 JWT 进行签名。公钥可以分发给验证 JWT 的客户端。
const { generateKeyPairSync} = require('crypto')
const fs = require('fs')
// 生成密钥对
const { privateKey, publicKey } = generateKeyPairSync('rsa', {
modulusLength: 2048,
privateKeyEncoding: {
type: 'pkcs1',
format: 'pem',
},
publicKeyEncoding: {
type: 'spki',
format: 'pem',
},
})
// 写入到文件中
fs.writeFileSync('private.pem', privateKey)
fs.writeFileSync('public.pem', publicKey)
在上面的代码块中,我们使用 cryptography 库中的 generateKeyPairSync 函数来生成 RSA 密钥对。我们指定了私钥格式为 PKCS1,公钥格式为 SPKI,并将它们写入文件中。
const fs = require('fs')
const jwt = require('jsonwebtoken')
// 读取密钥
const privateKey = fs.readFileSync('private.pem')
// 创建 token
const payload = {
user: 'John'
}
const options = {
algorithm: 'RS256',
expiresIn: '1h'
}
const token = jwt.sign(payload, privateKey, options)
在上面的代码块中,我们使用 Node.js 的 fs 模块读取私钥文件,然后使用 jwt 库中的 sign 函数创建 JWT。我们指定了算法为 RS256,并指定了过期时间为 1 小时。
const fs = require('fs')
const jwt = require('jsonwebtoken')
// 读取公钥
const publicKey = fs.readFileSync('public.pem')
// 验证 token
const token = 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoiSm9obiIsImlhdCI6MTYyMTcwODUwOCwiZXhwIjoxNjIxNzE1MzA4LCJpc3MiOiJodHRwczovL2V4YW1wbGUuY29tIiwianRpIjoiY2Q2ODQ2NzctMzc2NS00ZjJkLWFkOTktMmE3MWI5OWRmMjczIiwibmJmIjoxNjIxNzA4NTA4LCJzdWIiOiIxMjM0NTY3ODkwIn0.Ql0w-tczmGxKq3Ffcwr-x49Lrpc0h0MQDmf8ry1keFzZ4w4ZNaRNnijJ8sbrWdDy9SfCi48Mk83tq3LWfBxcZzDEg69IpajdpZCJQlA9XyNWgEmcLpNFfhrrCYJLZoMImZwHKzEPfRSxMkW2yN9XOJc1pFcvsHly8WFRpZhr4'
const decoded = jwt.verify(token, publicKey, {algorithms: ['RS256']})
console.log(decoded)
在上面的代码块中,我们使用 Node.js 的 fs 模块读取公钥文件,然后使用 jwt 库中的 verify 函数来验证 JWT。如果有效,我们将对 JWT 进行解码并将其打印到控制台上。
总结
在这篇文章中,我们了解了如何使用 cryptography 库创建 RSA 密钥对,并使用 jwt 库创建和验证 JWT。我们学习了如何使用私钥对 JWT 进行签名,并将公钥分发给验证 JWT 的客户端。
我们还探讨了 JWT 中安全签名的重要性,并了解了如何使用 Node.js 和 cryptography 库来创建安全的 JWT 密钥。
参考文献