golang生成RSA公钥和密钥

目录

场景

场景一:加密、解密

场景二:微信退款

场景三:SSL证书

为什么是.key和.pem格式的文件

生成密钥、公钥

密钥、公钥保存到文件中

第一个:保存密钥到文件里

第二个:保存公钥到文件里


场景

场景一:加密、解密

A服务器向B服务器传入一组请求参数,这组参数比较敏感,所以需要A进行加密;

B接收到参数,因是加密过的,所以需要用特定的方式进行解密。

场景二:微信退款

微信退款功能,对接过的小伙伴都知道,微信官方会生成一组密钥、公钥文件给到我们

场景三:SSL证书

例如我们使用nginx部署HTTPS时,就需要用到SSL证书,去购买了证书后,就能得到SSL证书文件,由两个文件组成:.key 和 .pem 格式的文件,而这两个文件,就是rsa公钥和私钥

为什么是.key和.pem格式的文件

RSA生成的公钥和私钥保存为.key和.pem格式的文件,主要是出于可读性和安全性的考虑。

可读性:

  • RSA公钥和私钥的原始数据通常是二进制格式,对于人类来说直接阅读和理解这些二进制数据是非常困难的。
  • 为了提高可读性,这些二进制数据通常会被转换为Base64编码的文本格式。Base64编码是一种用64个可打印字符来表示二进制数据的方法,它可以将二进制数据转换为ASCII字符串格式,从而便于人类阅读和理解
  • PEM(Privacy Enhanced Mail)格式就是基于Base64编码的文本格式,用于表示和传输密钥、证书等加密数据。PEM文件通常以"-----BEGIN...-----"和"-----END...-----"作为文件的开头和结尾,中间是Base64编码的数据。

安全性:

  • PEM格式不仅可以表示公钥和私钥的Base64编码数据,还可以包含其他信息,如加密算法、证书链等。这些信息对于密钥和证书的管理和使用非常重要。
  • PEM文件通常使用文本文件的形式存储,这使得它们可以在不同的操作系统和平台之间轻松交换和传输。同时,由于PEM文件是文本格式,所以可以使用文本编辑器或专门的工具进行查看和编辑,这有助于用户更好地管理和使用密钥和证书。
  • 需要注意的是,虽然PEM文件提高了密钥和证书的可读性和可管理型,但这也带来了一定的安全风险。因为PEM文件可以被任何人读取和复制,所以必须采取适当的安全措施来保护PEM文件的安全性和完整性。例如,可以将PEM文件存储在受保护的目录中,并限制对文件的访问权限;或者使用加密的方式存储和传输PEM文件等。

文件扩展名:

  • .key和.pem是常见的文件扩展名,用于表示不同类型的密钥和证书文件。虽然它们都可以用于存储RSA公钥和私钥的Base64编码数据,但具体的选择可能取决于特定的应用场景或工具的要求。
  • 一般来说,.key文件可能更多地用于表示私钥文件,而.pem文件则可能用于表示公钥,私钥或证书文件。然后,这并不是一个严格的规定,所以具体的选择可能因实际情况而异。

综上所述,RSA生成的公钥和私钥保存为.key和.pem格式的文件,主要是为了提高数据的可读性和安全性,并方便用户在不同的操作系统和平台之间交换和使用这些密钥和证书。

生成密钥、公钥

接下来,我们使用 golang 敲敲代码生成密钥和公钥

package main

import (
	"crypto/rand"
	"crypto/rsa"
	"fmt"
	"log"
)

func main() {
	GenerateRsa()
}

// GenerateRsa 生成rsa
func GenerateRsa() {
	// 生成RSA密钥对
	privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
	if err != nil {
		log.Fatalf("Error generating key: %s", err)
	}
	fmt.Println(privateKey) // 打印密钥
	publicKey := &privateKey.PublicKey
	fmt.Println(publicKey) // 打印公钥
}

执行命令:

go run main.go

打印了下面:

这些也就是我们所说的:

"RSA公钥和私钥的原始数据通常是二进制格式,对于人类来说直接阅读和理解这些二进制数据是非常困难的"

密钥、公钥保存到文件中

现在,我们将已生成的公钥、私钥,保存到文件里,而文件格式分别是.key和.pem

.key 保存私钥

.pen 保存公钥

我封装了两个方法:

第一个:保存密钥到文件里

// SavePrivateKey 将私钥保存到PEM格式的文件中
func SavePrivateKey(privateKey *rsa.PrivateKey, dirPath string, fileName string) error {
	_, err := os.Stat(dirPath) // 获取目录文件信息
	// 如果目录不存在
	if err != nil || os.IsNotExist(err) {
		// 递归的创建目录
		err := os.MkdirAll(dirPath, 0755)
		if err != nil {
			return fmt.Errorf("Error creating directory: %s\n", err)
		}
	}
	// 将私钥编码为ASN.1 DER格式
	privateKeyDER := x509.MarshalPKCS1PrivateKey(privateKey)

	// 使用PEM格式包装DER数据
	block := &pem.Block{
		Type:  "RSA PRIVATE KEY",
		Bytes: privateKeyDER,
	}

	// 将PEM块写入文件
	filePath := fmt.Sprintf("%s/%s", dirPath, fileName)
	file, err := os.Create(filePath)
	if err != nil {
		return err
	}
	defer file.Close()

	err = pem.Encode(file, block)
	if err != nil {
		return err
	}

	return nil
}

第二个:保存公钥到文件里

// SavePublicKey 将公钥保存到PEM格式的文件中
func SavePublicKey(publicKey *rsa.PublicKey, dirPath string, fileName string) error {
	_, err := os.Stat(dirPath) // 获取目录文件信息
	// 如果目录不存在
	if err != nil || os.IsNotExist(err) {
		// 递归的创建目录
		err := os.MkdirAll(dirPath, 0755)
		if err != nil {
			return fmt.Errorf("Error creating directory: %s\n", err)
		}
	}
	publicKeyASN1, err := x509.MarshalPKIXPublicKey(publicKey)
	if err != nil {
		return err
	}

	// 使用PEM格式包装DER数据
	block := &pem.Block{
		Type:  "PUBLIC KEY",
		Bytes: publicKeyASN1,
	}

	// 将PEM块写入文件
	filePath := fmt.Sprintf("%s/%s", dirPath, fileName)
	file, err := os.Create(filePath)
	if err != nil {
		return err
	}
	defer file.Close()

	err = pem.Encode(file, block)
	if err != nil {
		return err
	}

	return nil
}

因为在 main 主函数里,我们调用了 "GenerateRsa" 函数,所以我们在 "GenerateRsa" 里调用这两个方法:

// GenerateRsa 生成rsa
func GenerateRsa() {
	// 生成RSA密钥对
	privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
	if err != nil {
		log.Fatalf("Error generating key: %s", err)
	}
	publicKey := &privateKey.PublicKey
	dirPath := "/app/rsa"
	fileName := "private.key"
	err = SavePrivateKey(privateKey, dirPath, fileName)
	if err != nil {
		fmt.Println(err)
	}
	fileName = "public.pem"
	err = SavePublicKey(publicKey, dirPath, fileName)
	if err != nil {
		fmt.Println(err)
	}
}

因为 main 主函数里,调用了 "GenerateRsa()",所以我们直接运行go程序

go run main.go

运行后,因为我们没有额外的打印信息,也没有出现报错信息,所以我们可以看一下目录下:

/app/rsa

在这个目录下,就生成了以下两个文件:

private.key
public.pem

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/753161.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ForkJoinPool浅析

一,概述 相比传统的线程池ExecuteService,ForkJoinPool的优势在于能采用分治算法、工作窃取算法高效利用CPU资源,如下图 Fork即拆分,Join即合并, 通过将大任务拆分成多个小任务,在多个线程中执行后,合并结果即可得到大任务的结果,经典的例子有归并排序、超大数组求和…

如何保护应用?可快速部署的WAF服务器分享

Web应用攻击是安全事件和数据泄露的主要原因。相关统计表明,超过四分之三的网络犯罪直指应用及其漏洞。为保护数量日益增长的应用安全,Web应用防火墙(WAF)因此而生。本文则聚焦于WAF服务器,了解它的性能与具体的实践应用。   新加坡网络安全…

Linux应急响应靶机 2

一、靶机介绍 应急响应靶机-Linux2 前景需要:看监控的时候发现webshell告警,领导让你上机检查你可以救救安服仔吗!! 1,提交攻击者IP 2,提交攻击者修改的管理员密码(明文) 3,提交第一次Webshell的连接URL(http://xxx.xxx.xxx.…

变“回锅肉”专场的《歌手2024》,是不是高开低走了?

《歌手2024》播出已经过半,似乎出现了高开低走的不妙趋势。 6月26日,《歌手》节目组官宣第八期节目的补位歌手为谭维维,曾主动“请战”的她再次回到了《歌手》舞台,实力歌手加入节目按理说是件好事,却意外并未受到观众…

每天写java到期末考试--复习集合与泛型--6.28

1、定义一个Student类,具有name、sex、age属性,具有getName、setName、getSex、setSex、 getAge、setAge方法和三个参数的构造方法 2、编写一个类,名字为ListDemo,在main方法中做以下工作: 定义一个可以保存Student类型对象的List类型对象list1,然后向list1中放入2个学生:new S…

Web渗透:php反序列化漏洞

反序列化漏洞(Deserialization Vulnerability)是一种在应用程序处理数据的过程中,因不安全的反序列化操作引发的安全漏洞;反序列化是指将序列化的数据(通常是字节流或字符串)转换回对象的过程,如…

松下的台灯值得入手吗?书客、飞利浦真实横评大分享!

我们都知道,无论是学习还是工作,都需要一个良好的照明环境,而台灯就是我们日常生活中非常重要的照明工具。它不仅能够提供额外的光线,还能减少眼睛疲劳,提高我们的工作和学习效率。 所以,选购一款合适的台…

240622_昇思学习打卡-Day4-ResNet50迁移学习

240622_昇思学习打卡-Day4-ResNet50迁移学习 我们对事物的认知都是一点一点积累出来的,往往借助已经认识过的东西,可以更好地理解和认识新的有关联的东西。比如一个人会骑自行车,我们让他去骑摩托车他也很快就能学会,比如已经学会…

电脑提醒事项怎么显示在桌面

在繁忙的工作节奏中,我们经常会面临多项任务同时进行的情况。为了确保不遗漏任何重要事务,设置电脑提醒事项就显得尤为重要。想象一下,当你正忙于一个项目时,电脑屏幕突然弹出一个提醒,告诉你接下来的会议时间&#xf…

梦想CAD二次开发

1.mxdraw简介 mxdraw是一个HTML5 Canvas JavaScript框架,它在THREE.js的基础上扩展开发,为用户提供了一套在前端绘图更为方便,快捷,高效率的解决方案,mxdraw的实质为一个前端二维绘图平台。你可以使用mxdraw在画布上绘…

实力认可!安全狗受聘成为福建省网信系统2024年度网络安全技术支撑单位

6月6日,福建省委网信办组织召开福建省网信系统2024年度网络安全技术支撑单位座谈会。 作为国内云原生安全领导厂商,安全狗也受邀出席此次活动。 省委宣传部副部长、省委网信办主任、省互联网信息办公室主任张远出席会议并颁发支撑单位证书。安全狗凭借出…

如何用Vue3和Plotly.js绘制动态3D图表?

本文由ScriptEcho平台提供技术支持 项目地址:传送门 Plotly.js: 使用Vue.js动态加载数据并绘制图表 应用场景 在数据可视化应用中,需要将数据动态加载到图表中并进行实时更新。本文将展示如何使用Plotly.js和Vue.js实现这一功能,从加载外…

java基于ssm+jsp 电子商城系统

1管理员功能模块 管理员登录,通过填写用户名、密码进行登录,如图1所示。 图1管理员登录界面图 管理员登录进入电子商城系统可以查看个人中心、用户管理、医生管理、药品信息管理、线上诊疗管理、医生信息管理、管理员管理、论坛管理、系统管理、订单管…

snowflake 不再是个数据仓库公司了

标题先上结论,为啥这么认为,且听接下来道来。 snowflake 非常成功,开创了云数仓先河,至今在数仓架构上也是相对比较先进的,国内一堆模仿的公司,传统上我们会认为 snowflake 肯定是一家数据仓库公司。不过最…

智能工业网络,需要何种工业以太网交换机作为支撑?

随着工业企业数字化及信息化的进一步深化升级,工业领域相关控制及信息系统的业务类型不断增加、复杂性不断提升,工业控制网络与工业信息网络也呈现融合趋势,具备支持多业务、多协议、多厂商设备和数据的互联互通、共网承载以及高质量传输能力…

vue-router的学习

vue-router 基于Vue做单页面应用时,vue-router可以帮我们将url地址和组件绑定,在我们切换路由组件时,url改变,页面无需从服务端重新加载,即不用刷新,打个比方,我们用美团外卖点外卖时&#xff…

一文带你彻底搞懂设计模式之单例模式!!由浅入深,图文并茂,超超超详细的单例模式讲解!!

一文带你彻底搞懂设计模式之单例模式! 一、什么是单例模式?单例模式分类饿汉式创建单例对象懒汉式创建单例对象 多问一个为什么? 二、为什么要有单例模式?使用单例模式的原因单例模式的应用场景 三、多线程下的单例模式饿汉式懒汉…

【高级篇】InnoDB引擎深入:核心机制与实战优化(十五)

引言 在探索了MySQL集群与分布式技术之后,我们进入了数据库引擎的核心地带——InnoDB。作为MySQL的默认存储引擎,InnoDB凭借其对事务的支持、行级锁定、高效的恢复机制以及复杂的内存管理,成为众多应用场景的首选。本章,我们将深入InnoDB的内部机制,透彻理解锁管理、事务…

【C++】动态内存管理new和delete

文章目录 一、C的内存管理方式二、new和delete的用法1.操作内置类型2.操作自定义内置类型 三、new和delete的底层实现1.operator new和operator delete函数2.new和delete的实现原理 四、定位new表达式五、malloc/free和new/delete的区别 一、C的内存管理方式 之前在C语言的动态…

找不到vcomp140.dll怎么办,总结多种解决方法

​在日常使用电脑的过程中,我们可能会遇到一些错误提示,其中之一就是“vcomp140.dll丢失”。那么,vcomp140.dll是什么?它为什么会丢失?丢失后对电脑有什么影响?又该如何解决呢?本文将详细介绍vc…