golang生成RSA公鑰和密鑰的實現(xiàn)方法
場景
場景一:加密、解密
A服務器向B服務器傳入一組請求參數(shù),這組參數(shù)比較敏感,所以需要A進行加密;
B接收到參數(shù),因是加密過的,所以需要用特定的方式進行解密。
場景二:微信退款
微信退款功能,對接過的小伙伴都知道,微信官方會生成一組密鑰、公鑰文件給到我們
場景三:SSL證書
例如我們使用nginx部署HTTPS時,就需要用到SSL證書,去購買了證書后,就能得到SSL證書文件,由兩個文件組成:.key 和 .pem 格式的文件,而這兩個文件,就是rsa公鑰和私鑰
為什么是.key和.pem格式的文件
RSA生成的公鑰和私鑰保存為.key和.pem格式的文件,主要是出于可讀性和安全性的考慮。
可讀性:
- RSA公鑰和私鑰的原始數(shù)據通常是二進制格式,對于人類來說直接閱讀和理解這些二進制數(shù)據是非常困難的。
- 為了提高可讀性,這些二進制數(shù)據通常會被轉換為Base64編碼的文本格式。Base64編碼是一種用64個可打印字符來表示二進制數(shù)據的方法,它可以將二進制數(shù)據轉換為ASCII字符串格式,從而便于人類閱讀和理解
- PEM(Privacy Enhanced Mail)格式就是基于Base64編碼的文本格式,用于表示和傳輸密鑰、證書等加密數(shù)據。PEM文件通常以"-----BEGIN...-----"和"-----END...-----"作為文件的開頭和結尾,中間是Base64編碼的數(shù)據。
安全性:
- PEM格式不僅可以表示公鑰和私鑰的Base64編碼數(shù)據,還可以包含其他信息,如加密算法、證書鏈等。這些信息對于密鑰和證書的管理和使用非常重要。
- PEM文件通常使用文本文件的形式存儲,這使得它們可以在不同的操作系統(tǒng)和平臺之間輕松交換和傳輸。同時,由于PEM文件是文本格式,所以可以使用文本編輯器或專門的工具進行查看和編輯,這有助于用戶更好地管理和使用密鑰和證書。
- 需要注意的是,雖然PEM文件提高了密鑰和證書的可讀性和可管理型,但這也帶來了一定的安全風險。因為PEM文件可以被任何人讀取和復制,所以必須采取適當?shù)陌踩胧﹣肀WoPEM文件的安全性和完整性。例如,可以將PEM文件存儲在受保護的目錄中,并限制對文件的訪問權限;或者使用加密的方式存儲和傳輸PEM文件等。
文件擴展名:
- .key和.pem是常見的文件擴展名,用于表示不同類型的密鑰和證書文件。雖然它們都可以用于存儲RSA公鑰和私鑰的Base64編碼數(shù)據,但具體的選擇可能取決于特定的應用場景或工具的要求。
- 一般來說,.key文件可能更多地用于表示私鑰文件,而.pem文件則可能用于表示公鑰,私鑰或證書文件。然后,這并不是一個嚴格的規(guī)定,所以具體的選擇可能因實際情況而異。
綜上所述,RSA生成的公鑰和私鑰保存為.key和.pem格式的文件,主要是為了提高數(shù)據的可讀性和安全性,并方便用戶在不同的操作系統(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ù)據通常是二進制格式,對于人類來說直接閱讀和理解這些二進制數(shù)據是非常困難的"
密鑰、公鑰保存到文件中
現(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ù)據
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ù)據
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ù)里,我們調用了 "GenerateRsa" 函數(shù),所以我們在 "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 主函數(shù)里,調用了 "GenerateRsa()",所以我們直接運行go程序
go run main.go
運行后,因為我們沒有額外的打印信息,也沒有出現(xiàn)報錯信息,所以我們可以看一下目錄下:
/app/rsa
在這個目錄下,就生成了以下兩個文件:
private.key public.pem
到此這篇關于golang生成RSA公鑰和密鑰的實現(xiàn)方法的文章就介紹到這了,更多相關golang生成RSA公鑰和密鑰內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Golang中interface{}轉為數(shù)組的操作
這篇文章主要介紹了Golang中interface{}轉為數(shù)組的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04

