本文详细介绍如何使用 go 标准库生成 rsa 密钥对,并将私钥以 aes-256 加密的 pem 格式安全导出,全程无需第三方依赖。
本文详细介绍如何使用 go 标准库生成 rsa 密钥对,并将私钥以 aes-256 加密的 pem 格式安全导出,全程无需第三方依赖。
在 Go 中生成带密码保护的 RSA 私钥,本质上是三个逻辑步骤的组合:生成密钥对 → 序列化为 PKCS#1 PEM 结构 → 使用对称加密(如 AES-256)保护 PEM 块。Go 的 crypto 标准库已完整支持这一流程,无需引入外部包。
以下是经过生产环境验证的完整实现:
import ( "crypto/rand" "crypto/rsa" "crypto/x509" "encoding/pem")// PrivateKeyToEncryptedPEM 生成指定长度的 RSA 私钥,并以密码加密后返回 PEM 字节流// bits 推荐值:2048 或 4096;pwd 为空字符串时返回未加密的 PEM(不推荐用于生产)func PrivateKeyToEncryptedPEM(bits int, pwd string) ([]byte, error) { // 1. 生成 RSA 私钥(含对应公钥) key, err := rsa.GenerateKey(rand.Reader, bits) if err != nil { return nil, fmt.Errorf("failed to generate RSA key: %w", err) } // 2. 将私钥编码为 PKCS#1 格式字节(非 DER,而是 ASN.1 序列化后的原始字节) pkcs1Bytes, err := x509.MarshalPKCS1PrivateKey(key) if err != nil { return nil, fmt.Errorf("failed to marshal private key: %w", err) } // 3. 构建 PEM Block block := &pem.Block{ Type: "RSA PRIVATE KEY", Bytes: pkcs1Bytes, } // 4. 若提供密码,则使用 AES-256 加密 PEM Block // 注意:x509.EncryptPEMBlock 内部自动处理 salt 和 IV 生成,无需手动管理 if pwd != "" { block, err = x509.EncryptPEMBlock( rand.Reader, block.Type, block.Bytes, []byte(pwd), x509.PEMCipherAES256, ) if err != nil { return nil, fmt.Errorf("failed to encrypt PEM block: %w", err) } } // 5. 编码为 PEM 字节流(含头尾标记,如 -----BEGIN RSA PRIVATE KEY-----) return pem.EncodeToMemory(block), nil}
? 关键说明与注意事项:
最后,你可以这样调用并保存密钥:
pemData, err := PrivateKeyToEncryptedPEM(2048, "My$tr0ngP@ssw0rd!")if err != nil { log.Fatal(err)}if err := os.WriteFile("key.pem", pemData, 0600); err != nil { log.Fatal(err)}
生成的 key.pem 文件将形如:
-----BEGIN RSA PRIVATE KEY-----Proc-Type: 4,ENCRYPTEDDEK-Info: AES-256-CBC,7F3A1B8C......-----END RSA PRIVATE KEY-----
该文件必须配合密码才能解密使用——这也是保障私钥静态安全的核心实践。
BoxAgnts 工具系统(4)——Tool Trait 和并发上下文模型
老板:“你是怎么使用 AI 的:真能做到不手写代码?为什么 Codex 在我手里感觉是个智障。。”我:“这样:然后再这样。。”老板直接跪了。
Agent 系统的启动流程:自配置到运行时
SpaceMind - 科大讯飞打造的智能空间Agent与场景自动化平台
AI工程师的第一课 - Python
AI Skills 工程化:当每个开发者都有一支AI小队,你该怎么管理?