使用AES-256-CBC在Node.js中加密和解密数据
#javascript #安全 #node #encryption

本教程旨在教您如何在Node.js中加密和解密数据
此处提供的方法非常简单且易于理解,因为它的编写目的是使其他程序员和开发人员能够学习如何在其应用程序中加密数据。
此加密方法可用于文件,消息或应用程序需要加密的任何其他数据。

在本教程中,提供的加密和解密方法基于AES-256算法,以及为什么我们使用此算法,因为它是当今使用中最受欢迎的加密算法之一,并且它众所周知。安全。

注意:AES-256算法是一种对称键算法,这意味着相同的密钥用于加密和解密。这与非对称键算法相反,该算法使用公共密钥进行加密和私钥进行解密。

先决条件

  • node.js
  • npm或纱线
  • JavaScript的知识

入门

要开始,您需要创建一个新的项目文件夹并在其中初始化NPM或纱线。为此,请在终端中运行以下命令:

我将在本教程中使用纱线,但是如果您愿意,可以使用NPM。

mkdir nodejs-encryption
cd nodejs-encryption
yarn init -y

这将创建一个名为nodejs-recryption的新文件夹,并在其中初始化纱线。 -y标志用于跳过交互式模式并使用默认值。

安装依赖项

要安装依赖项,请在终端中运行以下命令:

yarn add express dotenv
yarn add -D nodemon

这将安装Express和Dotenv模块,Nodemon模块将安装在DevDepentencies中。

修改软件包。

我们将在package.json文件中使用模块类型来启用我们项目中的ES6模块的使用。


"type": "module",
"scripts": {
    "start": "node server.js",
    "dev": "nodemon server.js"
  }

创建配置文件

创建配置文件,在项目的根目录中创建一个名为config.js的新文件。在此文件中,您将存储秘密密钥,秘密IV和加密方法。秘密密钥和秘密IV用于生成秘密哈希,该哈希用于加密和解密。加密方法用于指定要使用的加密算法。在本教程中,我们将使用AES-256算法。

// config.js
import dotenv from 'dotenv'

dotenv.config()

const { NODE_ENV, PORT, SECRET_KEY, SECRET_IV, ECNRYPTION_METHOD } = process.env

export default {
  env: NODE_ENV,
  port: PORT,
  secret_key: SECRET_KEY,
  secret_iv: SECRET_IV,
  ecnryption_method: ECNRYPTION_METHOD,
}

注意:配置文件是在encryption.js文件中导入的,因此您需要确保配置文件与engryption.js文件相同的目录。

创建服务器文件

要创建服务器文件,请在项目的根目录中创建一个名为server.js的新文件。

// server.js
import express from 'express'

const app = express()

app.use(express.json())
app.use(express.urlencoded({ extended: false }))

app.listen(3000, () => {
  console.log('Server is running on port 3000')
})

这将创建新的Express服务器并在端口3000上收听。

创建加密模块

要创建加密模块,请在项目的根目录中创建一个名为Encryption.js的新文件。


在此文件中,您将导入加密模块和配置文件。配置文件包含secret_key,secret_iv和ecnryption_method。

然后将这些变量分配给其自己的变量。如果丢失了这些变量中的任何一个,则会丢弃错误。

然后用加密货币生成一个秘密哈希来进行加密。此哈希是使用sha512方法以及来自配置文件的secret_key和secret_iv创建的。然后将哈希作为密钥的32个字符和IV的16个字符。

注意:iv代表初始化向量。初始化向量是一个随机值,用于加密明文的第一个块。需要初始化向量才能解密密文,因此必须在密文上进行传输或存储。

然后导出两个函数:encryptdata()和decryptdata()。 EncryptData()函数将数据作为参数输入,并使用Cipheriv方法从Crypto进行加密,然后将其转换为十六进制格式,然后再将其转换为base64格式。 decryptdata()函数将加密的数据作为参数采用,并在使用crypto解密之前将其转换为UTF8格式,然后将其转换回UTF8格式。

// encryption.js
import crypto from 'crypto'
import config from './config.js'

const { secret_key, secret_iv, ecnryption_method } = config

if (!secret_key || !secret_iv || !ecnryption_method) {
  throw new Error('secretKey, secretIV, and ecnryptionMethod are required')
}

// Generate secret hash with crypto to use for encryption
const key = crypto
  .createHash('sha512')
  .update(secret_key)
  .digest('hex')
  .substring(0, 32)
const encryptionIV = crypto
  .createHash('sha512')
  .update(secret_iv)
  .digest('hex')
  .substring(0, 16)

// Encrypt data
export function encryptData(data) {
  const cipher = crypto.createCipheriv(ecnryption_method, key, encryptionIV)
  return Buffer.from(
    cipher.update(data, 'utf8', 'hex') + cipher.final('hex')
  ).toString('base64') // Encrypts data and converts to hex and base64
}

// Decrypt data
export function decryptData(encryptedData) {
  const buff = Buffer.from(encryptedData, 'base64')
  const decipher = crypto.createDecipheriv(ecnryption_method, key, encryptionIV)
  return (
    decipher.update(buff.toString('utf8'), 'hex', 'utf8') +
    decipher.final('utf8')
  ) // Decrypts data and converts to utf8
}

创建路线

要创建路由,在项目的根目录中创建一个名为doutes.js的新文件。

在此文件中,您将导入快速路由器和加密模块。加密模块包含encryptdata()和decryptdata()函数。

encryptdata()函数用于加密请求主体中发送的数据,并使用decryptdata()函数来解密请求主体中发送的数据。

// routes.js
import express from 'express'
import { encryptData, decryptData } from './encryption.js'

const router = express.Router()

router.post('/encrypt', (req, res) => {
  const { data } = req.body
  const encryptedData = encryptData(data)
  res.json({ encryptedData })
})

router.post('/decrypt', (req, res) => {
  const { encryptedData } = req.body
  const data = decryptData(encryptedData)
  res.json({ data })
})

export default router

创建.env文件

要创建.env文件,请在项目的根目录中创建一个名为.env的新文件。

在此文件中,您将存储Secret_Key,Secret_IV和Encryption_Method。 Secret_Key和Secret_IV用于生成Secret Hash,用于加密和解密。 Encryption_Method用于指定要使用的加密算法。

在本教程中,我们将使用AES-256算法。


NODE_ENV=development
PORT=3000
SECRET_KEY=secretKey
SECRET_IV=secretIV
ECNRYPTION_METHOD=aes-256-cbc

注意:.env文件是在config.js文件中导入的,该文件用于存储secret_key,secret_iv和encryption_method。

创建.gitignore文件

要创建.gitignore文件,请在项目的根目录中创建一个名为.gitignore的新文件。在此文件中,您将忽略node_modules文件夹和.env文件。

node_modules
.env

导入服务器文件中的路由

要导入服务器文件中的路由,请在server.js文件中导入路由文件。我们更新的server.js文件将看起来像这样:

// server.js
import express from 'express'
import routes from './routes.js'

const app = express()

app.use(express.json())
app.use(express.urlencoded({ extended: false }))
app.use(routes)

app.listen(3000, () => {
  console.log('Server is running on port 3000')
})

测试API

要测试API,请通过在终端中运行以下命令来启动服务器:

yarn dev

注意:dev脚本是在package.json文件中定义的。

要测试加密路线,请在请求正文中使用以下数据发送到http://localhost:3000/encrypt

{
  "data": "Hello World"
}

要测试解密路线,请将邮政请求发送到
http://localhost:3000/decrypt在请求正文中具有以下数据:

{
  "data": "encryptedData"
}

结论

在本教程中,您学会了如何创建使用node.js和express对数据进行加密和解密数据的API。您还学会了如何使用加密模块加密和解密数据。

您可以在GitHub repo上找到本教程的源代码。

如果您有任何疑问,请随时在下面的评论部分中询问。

快乐编码!

参考