最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

場景

場景一:加密、解密

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

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

場景二:微信退款

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

場景三:SSL證書

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

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

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

可讀性:

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

安全性:

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

文件擴展名:

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

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

生成密鑰、公鑰

接下來,我們使用 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) // 打印公鑰
}

執(zhí)行命令:

go run main.go

打印了下面:

這些也就是我們所說的:

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

密鑰、公鑰保存到文件中

現(xiàn)在,我們將已生成的公鑰、私鑰,保存到文件里,而文件格式分別是.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) {
		// 遞歸的創(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塊寫入文件
	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) {
		// 遞歸的創(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塊寫入文件
	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 主函數(shù)里,我們調(diào)用了 "GenerateRsa" 函數(shù),所以我們在 "GenerateRsa" 里調(diào)用這兩個方法:

// 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 主函數(shù)里,調(diào)用了 "GenerateRsa()",所以我們直接運行g(shù)o程序

go run main.go

運行后,因為我們沒有額外的打印信息,也沒有出現(xiàn)報錯信息,所以我們可以看一下目錄下:

/app/rsa

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

private.key
public.pem

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

相關(guān)文章

  • golang struct 實現(xiàn) interface的方法

    golang struct 實現(xiàn) interface的方法

    這篇文章主要介紹了golang struct 實現(xiàn) interface的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • 淺談Go語言的error類型

    淺談Go語言的error類型

    這篇文章主要介紹了淺談Go語言的error類型,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • GO語言gin框架實現(xiàn)管理員認證登陸接口

    GO語言gin框架實現(xiàn)管理員認證登陸接口

    這篇文章主要介紹了GO語言gin框架實現(xiàn)管理員認證登陸接口,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • golang實現(xiàn)unicode轉(zhuǎn)換為字符串string的方法

    golang實現(xiàn)unicode轉(zhuǎn)換為字符串string的方法

    這篇文章主要介紹了golang實現(xiàn)unicode轉(zhuǎn)換為字符串string的方法,實例分析了Go語言編碼轉(zhuǎn)換的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2016-07-07
  • 淺談go語言中別名類型的使用

    淺談go語言中別名類型的使用

    類型別名是 Go 1.9 版本添加的新功能,主要用于解決代碼升級、遷移中存在的類型兼容性問題,本文主要介紹了go語言中別名類型的使用,感興趣的可以了解一下
    2024-01-01
  • Golang實現(xiàn)AES對稱加密算法實例詳解

    Golang實現(xiàn)AES對稱加密算法實例詳解

    所謂對稱加密是指在加密和解碼時使用同一密鑰的加密方式,下面這篇文章主要給大家介紹了關(guān)于Golang實現(xiàn)AES對稱加密算法的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-02-02
  • 一文詳解Golang中net/http包的實現(xiàn)原理

    一文詳解Golang中net/http包的實現(xiàn)原理

    這篇文章主要介紹了如何用?net/http?自己編寫實現(xiàn)一個?HTTP?Server?并探究其實現(xiàn)原理,具體講解Go語言是如何接收和處理請求的,希望能夠?qū)Υ蠹业膶W(xué)習(xí)或工作具有一定的幫助
    2022-08-08
  • 詳解Golang net/http包中的RoundTripper接口

    詳解Golang net/http包中的RoundTripper接口

    RoundTripper 是 net/http 包中的一個接口,定義了處理 HTTP 請求返回和響應(yīng)的方法,是 http.Client 結(jié)構(gòu)體中執(zhí)行 http 請求的核心部分,本文將詳細的給大家介紹Golang RoundTripper接口,需要的朋友可以參考下
    2023-09-09
  • Go語言中Seeker接口的用法詳解

    Go語言中Seeker接口的用法詳解

    Go語言標(biāo)準(zhǔn)庫中的io包提供了一系列接口,用于處理各種I/O操作,其中Seeker接口在處理大文件或需要隨機訪問的場景中非常有用,本文將結(jié)合具體案例,詳細介紹Go語言中io包的Seeker接口的用法,需要的朋友可以參考下
    2024-10-10
  • golang?waitgroup輔助并發(fā)控制使用場景和方法解析

    golang?waitgroup輔助并發(fā)控制使用場景和方法解析

    Golang?提供了簡潔的?go?關(guān)鍵字來讓開發(fā)者更容易的進行并發(fā)編程,同時也提供了?WaitGroup?對象來輔助并發(fā)控制,今天我們就來分析下?WaitGroup?的使用方法,順便瞧一瞧它的底層源碼
    2023-09-09

最新評論

新绛县| 米易县| 尉氏县| 革吉县| 宁德市| 黄山市| 西昌市| 淳化县| 临高县| 杨浦区| 北海市| 米林县| 庆安县| 米脂县| 台安县| 东乡县| 长子县| 田东县| 武乡县| 丹阳市| 平顶山市| 钟祥市| 神池县| 红桥区| 阜城县| 屏东市| 启东市| 屏山县| 鹤峰县| 五寨县| 西安市| 福泉市| 彭州市| 黔西县| 祁门县| 元谋县| 哈尔滨市| 兴仁县| 工布江达县| 普兰县| 河曲县|