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

DeepBSA实战指南:从安装到基因组分析的全流程解析

本文详细解析了DeepBSA工具从安装到基因组分析的全流程,特别介绍了其简化生物信息学分析的'一键式'操作和独家深度学习算法。通过实战案例展示了DeepBSA在信噪比处理和QTL定位上的优势,并提供了Linux和Windows系统的安装避坑指南、数据预处理技巧以及算法选择建议,帮助用户高效完成基因组分析。

weixin_28732953的博客 440

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

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

qq_53742640的博客 8686

智能循迹小车之PID控制算法

从光电传感器获取信号确认小车和黑线的偏离角度,通过PID算法算出左右车轮速度,控制小车前进或者后退。

yzj199921的博客 4640

JavaScript实现RSA加密和解密

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

weixin_48839391的博客 3930

自动驾驶嵌入式修炼秘籍:理想L9自动驾驶域控制器拆解

自动驾驶嵌入式修炼秘籍:理想L9自动驾驶域控制器拆解

pathfinder888的博客 2548

【架构师面试-缓存与搜索-1】-缓存与缓存置换策略源码实现

1:什么是缓存 缓存:加速数据访问的存储,降低延迟(latency),提升吞吐量(Throughput)的利器。 1:缓存演进历史 1. 查库 2. ConcurrentHashMap 3. LRU 4. Guava Cache 5. 分布式缓存(redis,MemCache) 6. 多级缓存 2:在什么地方加缓存 缓存对于每个开发者来说是相当熟悉了,为了提高程序的性能我们会去加缓存,但是在什么地方加缓存,如何加缓存呢? 举个栗子:假设一个网站,需要提高性能,缓存可以放在浏览器,可以放

chongfa2008的博客 6438

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

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

gitblog_00045的博客 1013

PY32F406K1CU6+I2C+ AT24C64 基本配置

【代码】PY32F406K1CU6+I2C+ AT24C64 基本配置。

sam的博客 90

前端RSA、AES加密

前端RSA、AES加密解密

weixin_49425795的博客 147

智能车图像处理24-进阶篇16--三叉路口的判断

这篇文章主要讲述图像处理中如何判断三叉路口并进行补线操作。

taiyuezyh的博客 1万+

弹窗提示报错: F:\c\CFX5\bin\Debug\net9.0-windows10.0.26100.0\CFX5.dll 面向无法动态枚举工具箱项目的平台...如何解决?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 946

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

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

老衲爱洗头的博客 1万+

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

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

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

weixin_27199085的博客 299

数学建模模型总结

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

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

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

gitblog_00411的博客 768

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

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

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

gitblog_00974的博客 267

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

余额充值