Node 实现 rsa加密、解密、签名、验证

node-rsa 密钥对生成 第一方案为 window.crypto.subtle.generateKey 但是某些情况下,在http链接无法获取 window.crypto.subtle对象,只能在https请求和localHost的时候能够获取到window.crypto.subtle对象。 为了解决任何时候都能生成密钥对,因此我选择了node-rsa来生成。 第二方案:使用node-rsa 库。 使用: public static CreateAesAPair(func: Function) { try {. 阅读详情

安装 node-rsa

npm install node-rsa
npm install @types/node-rsa -D

获取密钥对

const key = new NodeRsa({
   b: 512
})
const pubKey = key.exportKey('pkcs8-public')
const priKey = key.exportKey('pkcs8-private')

使用公钥对消息加密

const pubKey = new NodeRsa(publicKey, 'pkcs8-public')
const res = pubKey.encrypt(Buffer.from(data), 'base64')

使用私钥解密

const priKey = new NodeRsa(privateKey, 'pkcs8-private')
const res = priKey.decrypt(Buffer.from(data, 'base64'), 'utf8')

使用私钥对消息签名

const priKey = new NodeRsa(privateKey, 'pkcs8-private')
const signature = priKey.sign(Buffer.from(data)).toString('base64')

使用公钥验签

const pubKey = new NodeRsa(publicKey, 'pkcs8-public')
const res = pubKey.verify(data, Buffer.from(signature, 'base64'))

封装 & 测试

  • 封装 Rsa.ts
/**
 * zxj
 */

import NodeRsa from 'node-rsa'
import path from 'path'
import fs from 'fs'

export default class Rsa{
    private pubKey: string | null = null
    private priKey: string | null = null

    /**
     * 获取密钥对
     * @returns 返回 公钥和私钥
     */
    public getKeys(): {
        pubKey: string,
        priKey: string
    } {
        const key = new NodeRsa({
            b: 512
        })
        this.pubKey = key.exportKey('pkcs8-public')
        this.priKey = key.exportKey('pkcs8-private')
        return {
            pubKey: this.pubKey as string,
            priKey: this.priKey as string
        }
    }
    /**
     * 将密钥对写到文件
     * @param filepath 文件输出目录 [默认为程序运行目录]
     * @returns true: 写出成功 | false: 写出失败
     */
    public output(filepath?: string): boolean {
        if (!filepath) filepath = process.cwd() + path.sep
        filepath = filepath + path.sep
        try {
            fs.writeFileSync(
                filepath + 'rsa_pub',
                this.pubKey as string
            )
            fs.writeFileSync(
                filepath + 'rsa_pri',
                this.priKey as string
            )
            fs.writeFileSync(
                filepath + 'rsa_key',
                this.pubKey as string + '\n' + this.priKey as string
            )
            return true
        } catch (error) {
            return false
        }
    }
    /**
     * 使用公钥对消息加密
     * @param data 消息数据
     * @param publicKey 公钥 [默认为当前 rsa 对象公钥]
     * @returns 公钥加密后的数据 [base64加密的]
     */
    public encryptByPubKey(data: string, publicKey?: string): any {
        if (!publicKey) publicKey = this.pubKey as string
        if (!publicKey) return null
        try {
            const pubKey = new NodeRsa(publicKey, 'pkcs8-public')
            return pubKey.encrypt(Buffer.from(data), 'base64')
        } catch (error) {
            return null
        }
    }
    /**
     * 使用私钥解密
     * @param data 加密数据 [base64加密的]
     * @param privateKey 私钥 [默认为当前 rsa 对象私钥]
     * @returns 私钥解密后的数据
     */
    public decryptByPriKey(data: string, privateKey?: string): any {
        if (!privateKey) privateKey = this.priKey as string
        if (!privateKey) return null
        try {
            const priKey = new NodeRsa(privateKey, 'pkcs8-private')
            return priKey.decrypt(Buffer.from(data, 'base64'), 'utf8')
        } catch (error) {
            return null
        }
    }
    /**
     * 使用私钥对消息签名
     * @param data 消息数据
     * @param privateKey 私钥 [默认为当前 rsa 对象私钥]
     * @returns 签名数据 [base64加密的]
     */
    public signature(data: string, privateKey?: string): any {
        if (!privateKey) privateKey = this.priKey as string
        if (!privateKey) return null
        try {
            const priKey = new NodeRsa(privateKey, 'pkcs8-private')
            return priKey.sign(Buffer.from(data)).toString('base64')
        } catch (error) {
            return null
        }
    }
    /**
     * 使用公钥验签
     * @param data 消息数据
     * @param signature 签名数据 [base64加密的]
     * @param publicKey 公钥 [默认为当前 rsa 对象公钥]
     * @returns true: 验签成功 | false: 验签失败
     */
    public verify(data: string, signature: string, publicKey?: string): boolean {
        if (!publicKey) publicKey = this.pubKey as string
        if (!publicKey) return false
        try {
            const pubKey = new NodeRsa(publicKey, 'pkcs8-public')
            return pubKey.verify(data, Buffer.from(signature, 'base64'))
        } catch (error) {
            console.log(error)
            return false
        }
    }
    /**
     * 装载密钥对
     * @param pubKey 公钥
     * @param priKey 私钥
     * @returns true: 装载成功 | false: 装载失败
     */
    public setKeys(pubKey: string, priKey: string): boolean {
        if (!pubKey || !priKey) return false
        this.pubKey = pubKey
        this.priKey = priKey
        return true
    }
    /**
     * 从文件获取密钥(或私钥)
     * @param filepath 文件路径
     * @returns '': 获取失败 | 密钥(或私钥)
     */
    public static getKey(filepath: string): string {
        if (!filepath) return ''
        try {
            const key = fs.readFileSync(filepath, {
                encoding: 'utf-8'
            })
            return key
        } catch (error) {
            return ''
        }
    }

}
  • 测试 test.ts
import Rsa from '../Rsa'
// 从对象获取公钥和私钥
// const rsa = new Rsa()
// const keys = rsa.getKeys()
// console.log(keys)
// const res_en_by_pub = rsa.encryptByPubKey('hello')
// const res_de_by_pri = rsa.decryptByPriKey(res_en_by_pub)
// const res_sign_by_pri = rsa.signature('123456')
// const res_verify_by_pub = rsa.verify('123456', res_sign_by_pri)
// console.log('公钥加密:' + res_en_by_pub)
// console.log('私钥解密:' + res_de_by_pri)
// console.log('私钥签名:' + res_sign_by_pri)
// console.log('公钥验证:' + res_verify_by_pub)
// 从已有文件加载私钥和公钥
const rsa = new Rsa()
const pubKey = Rsa.getKey(process.cwd() + '\\' + 'rsa_pub')
const priKey = Rsa.getKey(process.cwd() + '\\' + 'rsa_pri')
const res_en_by_pub = rsa.encryptByPubKey('123456', pubKey)
const res_de_by_pri = rsa.decryptByPriKey(res_en_by_pub, priKey)
const res_sign_by_pri = rsa.signature('123456', priKey)
const res_verify_by_pub = rsa.verify('123456', res_sign_by_pri, pubKey)
console.log('公钥加密:' + res_en_by_pub)
console.log('私钥解密:' + res_de_by_pri)
console.log('私钥签名:' + res_sign_by_pri)
console.log('公钥验证:' + res_verify_by_pub)

写在最后

欢迎留言、私信、讨论;
文章有知识性错误请立马联系博主,博主将非常感谢;
无需经过允许即可随意使用转载,知识本来就是被广泛用来学习的;
非常感谢您能看到此处,本文为博主学习笔记,如有不同见解,请不吝赐教。

Node-rsa 使用公钥私钥加密解密 Node-rsa 的加密解密格式模式是 pkcs1_oaep, 我使用的是pkcs1 java 端处理加密数据模式的格式是pkcs1 , 为了兼容能够和java 服务器的格式相对应,建议使用pkcs1 let privateKey = "-----BEGIN PRIVATE KEY-----" + 'MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAIXawhnxuqzgnwam' + 'IHZ94tpqTsQtmWIUIVidPCkRN+vJXk. 阅读详情

相关推荐

nodejs crypto 加密 对称加密 非对称加密

原文链接: nodejs crypto 加密 对称加密 非对称加密 ...

阿豪 884

node-rsa使用

简单介绍使用node-rsa模块生成/导出秘钥,加密/解密,签名/验证具体方法见API1.首先导入模块:npm install node-rsa2.生成,导入导出秘钥var NodeRSA = require('node-rsa'); var key = new NodeRSA({b: 512});//生成512位秘钥 var pubkey = key.exportKey('pkcs8-publ...

zhj_fly的博客 1万+

基于nodejs与websocket的加密认证聊天室

课程设计做的实验,简单把实现过程贴上来

桂小Z 2394

node之node-rsa模块,Node环境非对称加密RSA算法库

node-rsa 是一个用于在 Node.js 环境下进行 RSA 加密、解密、签名和验证的库。它提供了简单易用的 API,使得在 Node.js 中使用 RSA 加密算法变得更加方便。支持 RSA 密钥生成:node-rsa 可以生成符合 RSA 标准的公钥和私钥对。你可以使用 NodeRSA 类的 generateKeyPair 方法生成密钥对。加密和解密:使用 NodeRSA 实例的 encrypt 方法可以对数据进行 RSA 加密,使用 decrypt 方法可以对加密数据进行解密。

老衲爱洗头的博客 2901

前端RSA加密与后端PHP解密实践指南

RSA算法是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。它是第一个既能用于数据加密也能用于数字签名的算法。RSA的安全性基于大整数分解的难度,它是目前应用最广泛的公钥加密算法之一。是一个专门为JavaScript前端设计的RSA加密库。它能够帮助开发者轻松完成RSA公钥加密操作。尽管它仅支持公钥加密,但在很多场景下,如HTTPS中的SSL/TLS握手,公钥加密已经足以满足需求。

weixin_35592186的博客 1086

Ren’py教程《从入门到精通》

Ren’py是什么?Ren'py是一款用于制作视觉小说、冒险游戏、galgame的游戏制作工具,被来自世界各地的数千名创作者使用。Ren'py的名字由Ren’ai和Python混合而成,而Python也是Ren'py所使用的环境语言。Ren'py可以帮助你使用文字、图像和声音来讲述在计算机和移动设备上运行的交互式故事。这些既可以是视觉小说,也可以是生活模拟游戏。易于学习的脚本语言允许 任何人都可以有效地编写大型视觉小说,而它的Python 脚本足以应对复杂的 模拟游戏。

2302_77140651的博客 1万+

Node.js 中的 RSA 加密、解密、签名与验证详解

RSA算法作为一种非对称加密技术,在保障数据传输安全方面发挥着重要作用。Node.js提供了内置的crypto模块和第三方库node-rsa,使得在Node.js环境中实现RSA加密、解密、签名和验证变得简单易行。开发者可以根据项目需求和环境选择合适的工具进行数据加密和安全保护。

qq_53742640的博客 8686

aistudio高效解压zip文件的实用技巧

本文详细介绍了在百度AI Studio平台上高效解压ZIP文件的实用技巧。针对深度学习项目数据准备中的常见痛点,重点讲解了使用Python zipfile库和Linux unzip命令两种核心方法,并提供了路径设置、大文件处理、中文乱码等关键问题的解决方案,帮助用户提升数据处理效率。

salt的博客 784

JavaScript实现RSA加密和解密

在JavaScript中,可以使用RSA算法实现数据的加密和解密。下载链接RSA 是一种非对称加密算法,使用一对密钥:公钥 和 私钥。公钥加密:任何人可以使用公钥加密信息。私钥解密:只有拥有私钥的人才能解密加密的信息。私钥签名:私钥可以用于对消息进行签名。公钥验证签名:任何人都可以用公钥验证签名的真实性。通过这个封装好的 rsa-crypto.js 文件,所有与RSA加密和解密相关的操作(密钥生成、密钥存储、加密、解密)都被整理为独立的功能模块。

weixin_48839391的博客 3930

Python异步协程爬虫优化:解决aiohttp中ServerDisconnectedError的高效策略

本文深入探讨了在Python异步协程爬虫中使用aiohttp时,如何高效解决常见的ServerDisconnectedError问题。核心策略包括全局复用ClientSession、精细配置TCPConnector连接池、实施请求重试与速率限制,从而构建稳定、高效的异步爬虫架构,有效避免服务器断开连接错误。

pz890123的博客 857

恶意流量检测数据集

对当前公开的恶意流量相关数据集进行归类总结,持续更新相关论文

tyutwuxuan的博客 1940

【亲测免费】 推荐使用Node-RSA:强大的JavaScript RSA库

推荐使用Node-RSA:强大的JavaScript RSA库 在网络安全和数据加密的世界里,RSA(Rivest–Shamir–Adleman)算法是一个不可忽视的名字,它提供了强大的非对称加密功能。在Node.js的环境中,有一个非常出色的库——Node-RSA,它允许我们在纯JavaScript中无缝地实现RSA操作。本文将带你深入了解Node-RSA,并揭示其独特之处。 项目介绍 Node...

gitblog_00045的博客 1013

R语言的下载、安装及环境配置(Rstudio&VSCode)

R for Windows是一个免费的用于统计计算和统计制图的优秀工具,是R语言开发工具。它拥有数据存储和处理系统、数组运算工具(其向量、矩阵运算方面功能尤其强大)、完整连贯的统计分析工具、优秀的统计制图等功能。提供的图形界面,可以在其中访问控制台、创建脚本或安装其他软件包。

zegeai的博客 2万+

前端RSA、AES加密

前端RSA、AES加密解密

weixin_49425795的博客 147

地统计插值学习心得(一)

(创建地统计图层工具用于根据现有的地统计图层或者地统计模型来创建包含新要素数据集的地统计图层,也就是使用构建好的地统计模型用到新的数据集中)这表明,远离极值的区域预测不受极值的影响,并且还表明,包括极值会导致钼元素浓度高的区域周围的预测明显变高。通常,我们使用同一个数据集进行建模和预测,但是在实际插值过程中,这两步的数据可以是不同的,这就是处理极值的诀窍。如果你的数据集有无法忽略的极值时(比如这些钼元素浓度),一种常见的方法是首先显式移除极值进行建模,然后在预测中使用整个数据集(包括极值)。

JData_Engineer的博客 286

AUTOSAR汽车电子嵌入式编程精讲300篇-基于加密算法的车载CAN总线安全通信

随着科学技术的不断更新和社会文明的不断进步,汽车已经走入寻常百姓家, 成为当代社会必不可少的交通工具。伴随着互联网技术的飞速发展,汽车也不再 是一个简单的交通工具,已经逐渐发展成为一个集出行、通信、娱乐等功能于一 身的综合智能体,进而推动了车联网产业的蓬勃发展。车联网是在传统汽车的框架上安装了传感器、执行器、控制器等分布式和集 中式控制器,使汽车具备环境感知、协同控制、优化执行等功能,并通过网络技 术实现与车外环境的信息共享,给驾驶带来方便的同时也终将成为可以替代人操 作的新一代汽车[1-3]。

getusushu的博客 2590

nodejs之JSEncrypt模块,浏览器端非对称加密RSA算法库

JSEncrypt 是一个用于在浏览器中进行RSA加密和解密的 JavaScript 库。它提供了一种简单的方式来生成 RSA 密钥对、加密数据并使用私钥解密数据。生成密钥对:使用 JSEncrypt,你可以轻松地生成 RSA 密钥对。你可以通过调用 new JSEncrypt() 创建一个 JSEncrypt 实例,然后使用 getKey() 方法生成密钥对。生成的密钥对包括公钥和私钥。加密数据:一旦你有了密钥对,你可以使用公钥对数据进行加密。

老衲爱洗头的博客 1万+

十七、SAP-采购订单(STO)

业务逻辑、功能讲解、图文解析、章节总结

m0_72403327的博客 2067

对称与非对称加密实战:从AES-GCM到RSA的Python/Node.js代码实现

加密技术是保障数据安全的基石,其核心原理在于通过算法将明文转换为不可读的密文。对称加密使用同一密钥进行加解密,速度快,适合处理大量数据,如AES算法;非对称加密则使用公钥和私钥配对,解决了密钥分发难题,如RSA算法。在工程实践中,混合加密系统结合了两者优势,先用非对称加密安全交换对称密钥,再用对称密钥高效加密数据,广泛应用于HTTPS、SSH等场景。本文聚焦于AES-GCM和RSA等核心算法的实战应用,通过Python cryptography库和Node.js crypto模块的具体代码示例,演示如何实现

weixin_27199085的博客 299

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

node-jose完全指南:JavaScript实现的JSON加密与签名神器

**node-jose** 是一款强大的 JavaScript 库,专门用于实现 JSON 对象的加密(JWE)和签名(JWS)功能。作为 GitHub 加速计划中的重要项目,它为开发者提供了简单易用的 API,帮助在浏览器和 Node.js 环境中轻松处理安全的 JSON 数据交换。无论是构建身份验证系统、保护 API 通信,还是实现端到端加密,node-jose 都是理想的选择。 ## 🌟

gitblog_00411的博客 768

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

解密前端加密黑科技:crypto-browserify如何让Node.js crypto在浏览器中完美运行

crypto-browserify是一个将Node.js的`crypto`模块移植到浏览器环境的前端加密工具,它让开发者能够在浏览器中使用与Node.js相同的加密API,轻松实现数据加密、哈希计算、签名验证等安全功能。无论是构建安全的Web应用还是处理敏感数据,crypto-browserify都能提供可靠的加密支持。 ## 🚀 为什么需要crypto-browserify? 在Web开发

gitblog_00974的博客 267

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【nodejs】使用node-rsa数字签名/隐私信息加密解密

nodejs-使用node-rsa数字签名/隐私信息加密解密 加密解密:公钥加密,私钥解密 1.sender生成密钥对:私钥A,公钥A,将公钥A给接收者receiver 2.receiver生成密钥对:私钥B,公钥B,将公钥B给sender 3.sender持有:私钥A,公钥B 4.receiver持有:私钥B,公钥A 5.发送过程:【私钥保留在自己手中,只有自己能够解密,保证了数据的安...

皇夜_的博客 2655

node.js实现结合 RSA 和 AES 加密算法的消息交换加密传输&深入理解 node 中的 crypto 加密模块

本文主要介绍了结合使用对称加密算法(AES)和非对称加密算法(RSA)对消息交换双方消息加密传输的典型方案以及从简单的 hash 算法,到对称加密,最后到非对称加密和签名,都有个大致的了解。后续我们也会对 node 的其他模块进行深入的理解。文章中使用 nodejs 代码演示了主要流程的实现方式。在基于的浏览器/服务器(B/S)的服务中,浏览器端没有nodejs接口能力,可借助第三方库crypto-jsjsencrypt等提供的 API 实现相关加密和解密算法。

qq_53742640的博客 2247

RSA加密简单理解,node-rsa使用记录

RSA 一般由发送方(客户端)和接收方(服务端)各持有一对公钥和私钥。 双方交换自己的公钥。 数据交换的过程中,使用对方的公钥进行数据加密。自己私钥进行解密。 发送方使用私钥对信息进行加签(签名),将密文与签名作为参数发起请求。 接收方使用请求方公钥,明文,接收的签名,进行验签(签名验证)。 RSA签名和验签的作用 为了增强数据交换的安全性。假设不进行签名和验签。 发送方(客户端)的请求,可能被第三方拦截(中间人攻击)。 由于接收方(服务端)的公钥是公开的,中间人在拦截发送方请求后,使用公

japlus的博客 4543

在node环境实现RSA数据加密加签以及解密验签

在node环境实现数据加密加签以及解密验签 最近上密码学的课要求代码实现RSA算法,语言任选,可以引用包,我使用的是js,下面是内容 首先我们得知道一个客户端与服务端之间数据传输加密的过程,大致如下: 1、A给B发送信息STR 2、A先用SHA256对信息STR计算,得到摘要Z 3、A用A的私钥对Z进行加密,得到签名S(只有发送者的私钥才能代表发送者,只能使用发送方的私钥加密才能达到不可抵赖性) 4、A用B的公钥对信息STR和签名S加密,得到传输数据M 传输M 1、B用B的私钥对M解密,得到信息STR和签名

qq_45676251的博客 2647

node-rsa 和 PHP RSA加密解密方法

PHP RSA加密参考 <?php /** * RSA算法类 * 签名及密文编码:base64字符串/十六进制字符串/二进制字符串流 * 填充方式: PKCS1Padding(加解密) * 密钥信息 密钥位数:1024 bit 密钥格式: PKCS#8 * Notice:Only accepts a single block. Block size is equal to t...

LoweMuo_洛漠 1113
上一篇: tsconfig.json
下一篇: 树莓派安装LibreELEC并配置红外遥控
代码绘世界
博客等级 码龄8年 28粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码绘世界

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值