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

摩尔线程GPU实战:5分钟搞定AI模型部署(含Docker避坑指南)

本文详细介绍了摩尔线程GPU在AI模型部署中的实战应用,包括环境配置、Docker避坑指南及性能优化技巧。通过5分钟快速部署指南,帮助开发者高效利用摩尔线程GPU进行AI模型推理,特别针对常见兼容性问题提供解决方案,显著提升部署效率。

weixin_28736335的博客 454

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

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

qq_53742640的博客 8686

别再乱设阻尼了!Abaqus动力分析中瑞利阻尼的α和β到底怎么算?

本文深入解析Abaqus动力分析中瑞利阻尼参数α和β的科学计算方法,帮助工程师准确设置阻尼参数以提升仿真精度。详细介绍了基于模态阻尼比的经典计算方法和多模态优化法,并结合工程案例演示参数设置流程,避免常见的阻尼设置误区。

weixin_42634811的博客 731

JavaScript实现RSA加密和解密

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

weixin_48839391的博客 3930

三维视觉智能焊接系统:免示教技术的工业应用实践

本文深入探讨了三维视觉智能焊接系统中免示教技术的工业应用实践。该系统通过三维视觉相机实时扫描工件,自动识别焊缝并生成轨迹,将产线换型时间从数小时缩短至几分钟,显著提升了生产柔性。文章详细解析了其核心硬件、算法及工厂部署流程,并展望了与数字孪生、工艺智能化融合的未来趋势。

weixin_29091105的博客 432

实战解析:从Innovus到Calibre的LVS错误排查全流程

本文详细解析了从Innovus到Calibre的LVS错误排查全流程,涵盖物理验证关键步骤与工具链协同。通过实战案例分享,重点解决器件不匹配、连接性错误等常见问题,并提供GDS导出规范、网表修正策略等实用技巧,帮助工程师高效完成芯片设计物理验证。

9o8p7i6u5y的博客 1036

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

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

gitblog_00045的博客 1013

Cocos Creator3.5.2使用Spine切换皮肤

3、然后获取当前spine中是否有皮肤数据,如果spine连皮肤数据都没有,接着写可能会error,这里的 skins[skin],是判断皮肤列表中是否有需要更换的皮肤。2、因为spine往往意味着异步加载,换肤时也经常出现频繁异步的情况,所以下一步我们要可以判断当前spine组件里是否已经加载好了spine文件。换肤前隐藏好需要换肤的节点,避免穿帮;官网文档的换肤流程太简化,对于实际使用来说会有各种各样的问题。1、首先获取对应的spine组件。这里的skin自然是外部传入的需要换肤的皮肤名。

tc654321的博客 1817

前端RSA、AES加密

前端RSA、AES加密解密

weixin_49425795的博客 147

ABAP传输自定义IDOC实例

首先确定出站方和入站方,本例中我使用150作为发送方将200作为接收方。 发送端系统配置 进入tcode-SALE,点击定义逻辑系统,这里我定义D01CLNT150为发送端, D01CLNT200为接收端 2,将逻辑系统分配给对应的client 3,进入tcode-WE31,创建IDOC开发段(segment)这里可以按照实际需求创建想要传输的结构,为求简单我创建了ZKNA1并选取了几个客户主数据的字段作为示例 4,进入tcode-WE30,创建Idoc Ty...

Nathan的博客 4077

6、基于深度强化学习的无人机路径规划

本文介绍了一种结合人工势场法的改进DQN深度强化学习算法在无人机路径规划中的应用。通过设计合理的网络结构、状态空间、动作空间和融合引力-斥力机制的奖励函数,实现了无人机在复杂环境中的自主避障与目标导向飞行。采用轻量级神经网络提升实时性,并在Gazebo仿真环境中进行训练与测试,结果表明该算法具有快速收敛、高成功率和良好适应性。实验评估指标包括损失函数、最大Q值和任务成功率,验证了方法的有效性。文章还探讨了其在物流配送、农业植保和环境监测等领域的应用前景,并展望了多无人机协同与复杂环境适应性等未来研究方向。

html8的博客 238

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

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

老衲爱洗头的博客 1万+

华为OD机试双机位C卷 - 比赛 / 评委评分 (C++ & Python & JAVA & JS & GO)

华为OD机试双机位C卷 比赛,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试-比赛,华为OD机考-比赛。

qq_45776114的博客 1700

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

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

weixin_27199085的博客 299

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

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

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

gitblog_00411的博客 768

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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

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

gitblog_00974的博客 267

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【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、付费专栏及课程。

余额充值