欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

golang生成RSA公鑰和密鑰的實(shí)現(xiàn)方法

 更新時(shí)間:2024年08月14日 10:12:32   作者:幸享龍楓  
本文主要介紹了golang生成RSA公鑰和密鑰的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

場(chǎng)景

場(chǎng)景一:加密、解密

A服務(wù)器向B服務(wù)器傳入一組請(qǐng)求參數(shù),這組參數(shù)比較敏感,所以需要A進(jìn)行加密;

B接收到參數(shù),因是加密過(guò)的,所以需要用特定的方式進(jìn)行解密。

場(chǎng)景二:微信退款

微信退款功能,對(duì)接過(guò)的小伙伴都知道,微信官方會(huì)生成一組密鑰、公鑰文件給到我們

場(chǎng)景三:SSL證書(shū)

例如我們使用nginx部署HTTPS時(shí),就需要用到SSL證書(shū),去購(gòu)買(mǎi)了證書(shū)后,就能得到SSL證書(shū)文件,由兩個(gè)文件組成:.key 和 .pem 格式的文件,而這兩個(gè)文件,就是rsa公鑰和私鑰

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

RSA生成的公鑰和私鑰保存為.key和.pem格式的文件,主要是出于可讀性和安全性的考慮。

可讀性:

  • RSA公鑰和私鑰的原始數(shù)據(jù)通常是二進(jìn)制格式,對(duì)于人類(lèi)來(lái)說(shuō)直接閱讀和理解這些二進(jìn)制數(shù)據(jù)是非常困難的。
  • 為了提高可讀性,這些二進(jìn)制數(shù)據(jù)通常會(huì)被轉(zhuǎn)換為Base64編碼的文本格式。Base64編碼是一種用64個(gè)可打印字符來(lái)表示二進(jìn)制數(shù)據(jù)的方法,它可以將二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為ASCII字符串格式,從而便于人類(lèi)閱讀和理解
  • PEM(Privacy Enhanced Mail)格式就是基于Base64編碼的文本格式,用于表示和傳輸密鑰、證書(shū)等加密數(shù)據(jù)。PEM文件通常以"-----BEGIN...-----"和"-----END...-----"作為文件的開(kāi)頭和結(jié)尾,中間是Base64編碼的數(shù)據(jù)。

安全性:

  • PEM格式不僅可以表示公鑰和私鑰的Base64編碼數(shù)據(jù),還可以包含其他信息,如加密算法、證書(shū)鏈等。這些信息對(duì)于密鑰和證書(shū)的管理和使用非常重要。
  • PEM文件通常使用文本文件的形式存儲(chǔ),這使得它們可以在不同的操作系統(tǒng)和平臺(tái)之間輕松交換和傳輸。同時(shí),由于PEM文件是文本格式,所以可以使用文本編輯器或?qū)iT(mén)的工具進(jìn)行查看和編輯,這有助于用戶(hù)更好地管理和使用密鑰和證書(shū)。
  • 需要注意的是,雖然PEM文件提高了密鑰和證書(shū)的可讀性和可管理型,但這也帶來(lái)了一定的安全風(fēng)險(xiǎn)。因?yàn)镻EM文件可以被任何人讀取和復(fù)制,所以必須采取適當(dāng)?shù)陌踩胧﹣?lái)保護(hù)PEM文件的安全性和完整性。例如,可以將PEM文件存儲(chǔ)在受保護(hù)的目錄中,并限制對(duì)文件的訪問(wèn)權(quán)限;或者使用加密的方式存儲(chǔ)和傳輸PEM文件等。

文件擴(kuò)展名:

  • .key和.pem是常見(jiàn)的文件擴(kuò)展名,用于表示不同類(lèi)型的密鑰和證書(shū)文件。雖然它們都可以用于存儲(chǔ)RSA公鑰和私鑰的Base64編碼數(shù)據(jù),但具體的選擇可能取決于特定的應(yīng)用場(chǎng)景或工具的要求。
  • 一般來(lái)說(shuō),.key文件可能更多地用于表示私鑰文件,而.pem文件則可能用于表示公鑰,私鑰或證書(shū)文件。然后,這并不是一個(gè)嚴(yán)格的規(guī)定,所以具體的選擇可能因?qū)嶋H情況而異。

綜上所述,RSA生成的公鑰和私鑰保存為.key和.pem格式的文件,主要是為了提高數(shù)據(jù)的可讀性和安全性,并方便用戶(hù)在不同的操作系統(tǒng)和平臺(tái)之間交換和使用這些密鑰和證書(shū)。

生成密鑰、公鑰

接下來(lái),我們使用 golang 敲敲代碼生成密鑰和公鑰

package main

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

func main() {
	GenerateRsa()
}

// GenerateRsa 生成rsa
func GenerateRsa() {
	// 生成RSA密鑰對(duì)
	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) // 打印公鑰
}

執(zhí)行命令:

go run main.go

打印了下面:

這些也就是我們所說(shuō)的:

"RSA公鑰和私鑰的原始數(shù)據(jù)通常是二進(jìn)制格式,對(duì)于人類(lèi)來(lái)說(shuō)直接閱讀和理解這些二進(jìn)制數(shù)據(jù)是非常困難的"

密鑰、公鑰保存到文件中

現(xiàn)在,我們將已生成的公鑰、私鑰,保存到文件里,而文件格式分別是.key和.pem

.key 保存私鑰

.pen 保存公鑰

我封裝了兩個(gè)方法:

第一個(gè):保存密鑰到文件里

// SavePrivateKey 將私鑰保存到PEM格式的文件中
func SavePrivateKey(privateKey *rsa.PrivateKey, dirPath string, fileName string) error {
	_, err := os.Stat(dirPath) // 獲取目錄文件信息
	// 如果目錄不存在
	if err != nil || os.IsNotExist(err) {
		// 遞歸的創(chuàng)建目錄
		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數(shù)據(jù)
	block := &pem.Block{
		Type:  "RSA PRIVATE KEY",
		Bytes: privateKeyDER,
	}

	// 將PEM塊寫(xiě)入文件
	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
}

第二個(gè):保存公鑰到文件里

// SavePublicKey 將公鑰保存到PEM格式的文件中
func SavePublicKey(publicKey *rsa.PublicKey, dirPath string, fileName string) error {
	_, err := os.Stat(dirPath) // 獲取目錄文件信息
	// 如果目錄不存在
	if err != nil || os.IsNotExist(err) {
		// 遞歸的創(chuàng)建目錄
		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數(shù)據(jù)
	block := &pem.Block{
		Type:  "PUBLIC KEY",
		Bytes: publicKeyASN1,
	}

	// 將PEM塊寫(xiě)入文件
	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
}

因?yàn)樵?main 主函數(shù)里,我們調(diào)用了 "GenerateRsa" 函數(shù),所以我們?cè)?"GenerateRsa" 里調(diào)用這兩個(gè)方法:

// GenerateRsa 生成rsa
func GenerateRsa() {
	// 生成RSA密鑰對(duì)
	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)
	}
}

因?yàn)?main 主函數(shù)里,調(diào)用了 "GenerateRsa()",所以我們直接運(yùn)行g(shù)o程序

go run main.go

運(yùn)行后,因?yàn)槲覀儧](méi)有額外的打印信息,也沒(méi)有出現(xiàn)報(bào)錯(cuò)信息,所以我們可以看一下目錄下:

/app/rsa

在這個(gè)目錄下,就生成了以下兩個(gè)文件:

private.key
public.pem

到此這篇關(guān)于golang生成RSA公鑰和密鑰的實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)golang生成RSA公鑰和密鑰內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • Golang應(yīng)用程序性能優(yōu)化技巧分享

    Golang應(yīng)用程序性能優(yōu)化技巧分享

    隨著科技的進(jìn)步,人人都想要快速的應(yīng)用,這就需要優(yōu)化您的應(yīng)用程序性能。本文為大家整理了一些Golang應(yīng)用程序性能優(yōu)化的技巧,希望對(duì)大家有所幫助
    2023-04-04
  • Go語(yǔ)言LeetCode題解682棒球比賽

    Go語(yǔ)言LeetCode題解682棒球比賽

    這篇文章主要為大家介紹了Go語(yǔ)言LeetCode題解682棒球比賽示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Go語(yǔ)言中如何實(shí)現(xiàn)并發(fā)

    Go語(yǔ)言中如何實(shí)現(xiàn)并發(fā)

    Go的并發(fā)機(jī)制通過(guò)協(xié)程和通道的簡(jiǎn)單性和高效性,使得編寫(xiě)并發(fā)代碼變得相對(duì)容易,這種并發(fā)模型被廣泛用于構(gòu)建高性能的網(wǎng)絡(luò)服務(wù)、并行處理任務(wù)和其他需要有效利用多核處理器的應(yīng)用程序,這篇文章主要介紹了在Go中如何實(shí)現(xiàn)并發(fā),需要的朋友可以參考下
    2023-09-09
  • Golang中interface{}轉(zhuǎn)為數(shù)組的操作

    Golang中interface{}轉(zhuǎn)為數(shù)組的操作

    這篇文章主要介紹了Golang中interface{}轉(zhuǎn)為數(shù)組的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • 細(xì)細(xì)探究Go 泛型generic設(shè)計(jì)

    細(xì)細(xì)探究Go 泛型generic設(shè)計(jì)

    這篇文章主要帶大家細(xì)細(xì)探究了Go 泛型generic設(shè)計(jì)及示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Golang 標(biāo)準(zhǔn)庫(kù) tips之waitgroup詳解

    Golang 標(biāo)準(zhǔn)庫(kù) tips之waitgroup詳解

    本篇文章給大家介紹Golang 標(biāo)準(zhǔn)庫(kù) tips之waitgroup的相關(guān)知識(shí),包括使用 channel 實(shí)現(xiàn) WaitGroup 的功能介紹,感興趣的朋友跟隨小編一起看看吧
    2021-07-07
  • golang croncli 定時(shí)器命令詳解

    golang croncli 定時(shí)器命令詳解

    定時(shí)器是執(zhí)行任務(wù)時(shí)的常用功能,配置系統(tǒng)的定時(shí)任務(wù)太麻煩,所以就想用golang簡(jiǎn)單實(shí)現(xiàn)一個(gè)定時(shí)器命令,包括定時(shí)器命令格式、定時(shí)執(zhí)行命令的相關(guān)知識(shí),感興趣的朋友跟隨小編一起看看吧
    2022-03-03
  • Go語(yǔ)言實(shí)現(xiàn)逐行讀取和寫(xiě)入文件詳解

    Go語(yǔ)言實(shí)現(xiàn)逐行讀取和寫(xiě)入文件詳解

    這篇文章主要介紹了如何使用go語(yǔ)言實(shí)現(xiàn)從輸入文件中讀取每行數(shù)據(jù),然后將每行字段組合成SQL插入腳本,然后逐行寫(xiě)入另外一個(gè)空白文件中,有需要的可以參考下
    2024-01-01
  • Golang WebView跨平臺(tái)的桌面應(yīng)用庫(kù)的使用

    Golang WebView跨平臺(tái)的桌面應(yīng)用庫(kù)的使用

    Golang WebView是一個(gè)強(qiáng)大的桌面應(yīng)用庫(kù),本文介紹了Golang WebView的特點(diǎn)和使用方法,并列舉示例詳細(xì)的介紹了其在實(shí)際項(xiàng)目中的應(yīng)用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • go語(yǔ)言LeetCode題解944刪列造序示例詳解

    go語(yǔ)言LeetCode題解944刪列造序示例詳解

    這篇文章主要為大家介紹了go語(yǔ)言LeetCode題解944刪列造序示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12

最新評(píng)論