📜  使用节点加密创建安全的 jwt 密钥 - Javascript (1)

📅  最后修改于: 2023-12-03 14:49:57.583000             🧑  作者: Mango

使用节点加密创建安全的 JWT 密钥 - JavaScript

JSON Web Tokens (JWTs) 是现代 Web 应用程序中常用的认证机制。它们提供了一种安全的方式,让应用程序在不需要再次进行身份验证的情况下识别用户。

使用 JWTs,我们可以在用户登录时将一个 token 返回给客户端。该 token 包含有关用户身份的信息,例如用户 ID 和角色。客户端将在以后的所有 API 请求中使用此 token,以验证其身份并获得相应的响应。

但是,JWTs 只有在部署正确的加密机制后才能被认为是安全的。否则,他们的负载可以被拦截和修改。

下面是如何使用 Node.js 和 cryptography 库创建安全的 JWT 密钥的步骤:

  1. 安装 cryptography 库
npm install --save cryptography
  1. 创建 RSA 密钥对

使用下面的命令创建 RSA 密钥对:

openssl genrsa -out private.pem 2048
openssl rsa -in private.pem -pubout > public.pem

这将生成一个私钥文件 private.pem 和一个公钥文件 public.pem 。私钥存储在服务器端,用于对 JWT 进行签名。公钥可以分发给验证 JWT 的客户端。

  1. 编写 Node.js 代码
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,并将它们写入文件中。

  1. 使用 JWT 库创建 token
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 小时。

  1. 使用 JWT 库验证 token
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 密钥。

参考文献

  1. Node.js cryptography. https://nodejs.org/api/crypto.html.
  2. JSON Web Tokens. https://jwt.io/.
  3. JavaScript - JWT Authentication Tutorial with Example API. https://jasonwatmore.com/post/2018/08/06/javascript-jwt-authentication-tutorial-with-example-api.