node加密集合(前端加密、后台解密)



一、crypto 加解密

  • cryptonode 的内置模块无需另外安装

生成私密钥

import { generateKeyPairSync, publicEncrypt, privateDecrypt } from 'crypto'

const { publicKey, privateKey } = generateKeyPairSync('rsa', {
    modulusLength: 1024,
    publicKeyEncoding: {
        type: 'spki',
        format: 'pem'
    },
    privateKeyEncoding: {
        type: 'pkcs8',
        format: 'pem',
        // cipher: 'aes-256-cbc',
        // passphrase: 'top secret',
    }
});

在这里插入图片描述

  • 把生成的公私秘钥保存(注意-------部分也是需要的,否则报错
// 公钥
export const PUBLIC_KEY = `
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC/NknF2LMwt77tg63x1KVXEz4Q
rKAGVhd9kUDxQaz6meP/Qy4OUDdDBGKanLkZ5n8e1YadxwHbR9XIUPohIvLNP3fm
tMGXO2oyq+TGQKmoAAuik4qtn7T3hwMAuKVClO3epgVmFMb9xbCufUE7N+xiKHa8
8z202y08jyQTVSdWHQIDAQAB
-----END PUBLIC KEY-----
`

// 私钥
export const PRIVATE_KEY = `
-----BEGIN PRIVATE KEY-----
MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAL82ScXYszC3vu2D
rfHUpVcTPhCsoAZWF32RQPFBrPqZ4/9DLg5QN0MEYpqcuRnmfx7Vhp3HAdtH1chQ
+iEi8s0/d+a0wZc7ajKr5MZAqagAC6KTiq2ftPeHAwC4pUKU7d6mBWYUxv3FsK59
QTs37GIodrzzPbTbLTyPJBNVJ1YdAgMBAAECgYEAnB2y9foLs4cSN9H/PycjJ4jq
b6rBrOq1myvxHglFNgZXhJ5RCBauR+VYrGuxJVhwCbjEhCVreqGYBkk3L77dBRRS
FwBqeZanUtTBKtZ06KKwAgRzPt/BOMNn+GDqt36U/2AyUXWg1qLe5r9hLWCEau5r
Yt8vYFrBKIaxu8YKIIECQQDxmpPEbyg9uors3yJ2qf0jv6cemMOsH3An4TdIiINx
7kFD/01otwOGFVUexPJgeCsi5zsnVK0AzdrqY6z4XBiVAkEAypsJGE/cDJb66qe3
PAA+8nRqgi6VGfQ3weCHlQhTO/ho5xPZIu63MVKyMZIPJ1MXQmMVRoz2lLmApZBL
wz79aQJBAONVUalJ9pFuz33mz2TcuoZCtZuCnst8oWnE7uHfId+4Ec1LkqjvW+90
by2On4nKSLyE2xI9CLRy/oQB2iWvcqkCQQCxAIcOlV4yJYjqjkF3iuNzYB9YwieC
uCgqGeV5Xv+QifHjxyRQ72peDdgdlHPmsCHG3tdMfoRB5FouyoRV++bZAkAso9+8
rTBM9sMow4Dw/lbeQGbvqz+w2ayfWbA4s7q8eSb25gnaAGZGAJ2Yx608DoGjIOZa
e2IyCqybjWEy7ycZ
-----END PRIVATE KEY-----
`

公钥加密(也可私钥加密)

publicKey为上述生成的公钥

import { publicEncrypt } from 'crypto'

//需要加密的数据
const data = "data to crypto"
// 公钥加密过程
const encryptData = publicEncrypt(publicKey, Buffer.from(data)).toString('base64');
console.log('encode:', encryptData);

私钥解密(也可公钥解密)

PRIVATE_KEY为上述生成的秘钥
encryptData为上述加密的值

import { privateDecrypt } from 'crypto'

// 私钥解密
const decryptData = privateDecrypt(PRIVATE_KEY, Buffer.from(encryptData, 'base64'));
console.log('decode:', decryptData.toString());

二、node-rsa加解密

生成公私秘钥

import NodeRSA from 'node-rsa'
let key = new NodeRSA({ b: 1024 })
    key.setOptions({ encryptionScheme:'pkcs1'})
    
let pubkey = key.exportKey('public') //生成公钥,发给前端用于数据加密
let privkey = key.exportKey('private')//生成私钥,用于数据解密
console.log(pubkey)
console.log(privkey)

在这里插入图片描述

使用公钥加密(也可私钥加密)

需要把密码先转为base64格式,并加上'base64', 'utf8'两个传参,避免出现乱码情况

let encrypt = new NodeRSA(pubkey)
// encrypt.setOptions({ encryptionScheme: 'pkcs1' })
const pass_word = encrypt.encrypt(Buffer.from("123456"), 'base64', 'utf8')
console.log(pass_word)

使用私钥解密(也可公钥解密)

let decrypt= new NodeRSA(privkey)
// decrypt.setOptions({ encryptionScheme: 'pkcs1' })
const s = pass_word.replace(/\s+/g, '+')
const decryptPass = decrypt.decrypt(s, 'utf8')
console.log('decode:', decryptPass)

在这里插入图片描述

三、前端项目使用jsencrypt加密

在前端项目使用前面两种加密会出现报错,发现并不支持前端项目
得使用jsencrypt加密

import JSEncrypt from "jsencrypt";
const encrypt = new JSEncrypt();
encrypt.setPublicKey(PUBLIC_KEY);
console.log(encrypt.encrypt("123456"));

注意,后台解密的时候,需要确认秘钥生成格式
解密的时候需要设置对应格式,否则会出现解密失败的情况

decrypt.setOptions({ encryptionScheme: 'pkcs1' })

秘钥文件格式存放

文件

  • /src/const/secret-key/public.pem (存放公钥数据)
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCwLgQqalNF4ge6PuDxmvcJtnFm
djh4YgkmKeTwve1L5gJglp/e/uRXRsBQxw0Vv0tAAIQA0sN036j5JTxGmcuxnuZ6
5Zw75jeaBQfE6+kgMD88cUnRlje3X3lMT2kRZsja+IowEvrLiUWuhV9rBPkskhxj
vJQd1A2+KaQU09lYYwIDAQAB
-----END PUBLIC KEY-----
  • /src/const/secret-key/private.pem (存放私钥数据)
-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgQCwLgQqalNF4ge6PuDxmvcJtnFmdjh4YgkmKeTwve1L5gJglp/e
/uRXRsBQxw0Vv0tAAIQA0sN036j5JTxGmcuxnuZ65Zw75jeaBQfE6+kgMD88cUnR
lje3X3lMT2kRZsja+IowEvrLiUWuhV9rBPkskhxjvJQd1A2+KaQU09lYYwIDAQAB
AoGAaUemT55oErumeIJ4s4gyFcjDbUI6Lp4O75JbcA1fD1rsksGP2Zch5pGt/Ndm
F1fP5Pgp6cAI8v9wnynEIkBnesS0j+Ydu43b6f94CXW5BwvQjy3mmkMKDvE8MHcT
h/lEosAIFfbpHD+5Uhxu47ynQRXzP9OE5Rn//MjeAS94XtkCQQD6qOQ9r2r4SsOr
5Rqh0Fr6xZrPvV5tuO2fhe+WO1XeVXPe7Dizdlck/AyWn8fL2dUERn+KvBiUblOy
zuFbQv09AkEAs+7oaDT4pkkV1mLvb+VSIut2guzcGh5o7n3dkXEKnca9dACRMK5N
Vecp3dnbAtJJwpXMuP5eJJYEc74HH1ZGHwJAAZdQ25NhenH/C/hIUv6flTfr46Ww
E8I4v+p5utplkSO5uJCHS5xUsUdoTQx2mDSpxX0tEhRfk5GftmLZy1qBgQJAUJ/+
t6L0v94D0Pqn+2WwNkF36xajUXjK4AK6I4+ZiDUjczVF2aBguttIIUabIlqD/pMN
Ft+z44TtHcfKfTo1VQJAYcgb8uGXgZVz9fFZqAaE8I0W2JkGn4zsta+RjSwxTJj9
SHDuAXBVEeLpS4hM8CA4fHmti6A0ezqh9B3U750/DA==
-----END RSA PRIVATE KEY-----

引入

const fs = require('fs')
const path = require('path')
//读取私钥加密
const rsaS = fs.readFileSync(path.join(__dirname,'./const/secret-key/private.pem'));
console.log('rsaS_rsaS', rsaS.toString())

在这里插入图片描述

优化,定义变量获取

  • /src/const/secret-key/index.ts (存放私钥数据)
import fs from 'fs'
import path from 'path'
export const PUBLIC_KEY = fs.readFileSync(path.join(__dirname, './public.pem'))
export const PRIVATE_KEY = fs.readFileSync(path.join(__dirname, './private.pem'))

总结

如有启发,可点赞收藏哟~

  • 28
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Node.js 提供了多种加密算法,可以用于字符串的加密解密。以下是一些常见的加密算法及其使用方法: 1. md5 加密 md5 是一种单向加密算法,可以将任意长度的字符串加密为一个固定长度的字符串。Node.js 中的 crypto 模块提供了 md5 加密算法。以下是一个示例代码片段: ```javascript const crypto = require('crypto'); const str = 'Hello, World!'; const hash = crypto.createHash('md5').update(str).digest('hex'); console.log(hash); ``` 在这个例子中,str 是要加密的字符串,crypto.createHash('md5') 创建了一个 md5 加密器,update() 方法用于向加密器输入数据,digest('hex') 方法用于输出加密结果。最终输出的结果是一个 32 位的十六进制字符串。 2. sha256 加密 sha256 是一种单向加密算法,可以将任意长度的字符串加密为一个固定长度的字符串。Node.js 中的 crypto 模块提供了 sha256 加密算法。以下是一个示例代码片段: ```javascript const crypto = require('crypto'); const str = 'Hello, World!'; const hash = crypto.createHash('sha256').update(str).digest('hex'); console.log(hash); ``` 在这个例子中,str 是要加密的字符串,crypto.createHash('sha256') 创建了一个 sha256 加密器,update() 方法用于向加密器输入数据,digest('hex') 方法用于输出加密结果。最终输出的结果是一个 64 位的十六进制字符串。 3. aes-256-cbc 加密 aes-256-cbc 是一种对称加密算法,可以将任意长度的字符串加密为一个固定长度的字符串,同样也可以将加密后的字符串解密为原始字符串。Node.js 中的 crypto 模块提供了 aes-256-cbc 加密算法。以下是一个示例代码片段: ```javascript const crypto = require('crypto'); const str = 'Hello, World!'; const key = 'mySecretKey'; const iv = 'myInitializationVector'; const cipher = crypto.createCipheriv('aes-256-cbc', key, iv); let encrypted = cipher.update(str, 'utf8', 'hex'); encrypted += cipher.final('hex'); console.log(encrypted); const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv); let decrypted = decipher.update(encrypted, 'hex', 'utf8'); decrypted += decipher.final('utf8'); console.log(decrypted); ``` 在这个例子中,str 是要加密的字符串,key 是加密密钥,iv 是初始化向量。crypto.createCipheriv() 方法用于创建一个加密器,update() 方法用于向加密器输入数据,final() 方法用于输出加密结果。crypto.createDecipheriv() 方法用于创建一个解密器,update() 方法用于向解密器输入数据,final() 方法用于输出解密结果。最终输出的结果应该是原始字符串。 这只是一些常见的加密算法和使用方法,Node.js 中的 crypto 模块还提供了很多其他的加密算法,需要根据具体的需求选择合适的加密算法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值