rsa加密在go中不能直接加密长数据,必须用oaep填充且密钥不低于2048位;rsa.encryptoaep依赖crypto/rand.reader生成密码学安全随机数以保障语义安全,避免重放攻击;私钥解析需匹配pkcs#1或pkcs#8格式;生产环境应采用rsa+aes-gcm混合加密方案。

RSA加密在Go里不能直接加密长数据,必须用OAEP填充,且密钥长度低于2048位会报错。
rsa.EncryptOAEP 为什么必须用 crypto/rand.Reader
因为RSA-OAEP是概率性加密,每次加密结果都不同,依赖高质量随机数生成盐值(salt)和掩码。如果用rand.New(rand.NewSource(time.Now().Unix()))这类伪随机源,会导致相同明文产生相同密文,破坏语义安全性,还可能被重放攻击利用。标准库crypto/rand.Reader对接操作系统熵池(如Linux的/dev/urandom),满足密码学安全要求。实际调用时别忘了检查错误:err != nil——常见错误是传入nil导致panic,或label参数为nil(这是允许的,但不能是未初始化指针)。
解密失败常见于密钥格式不匹配
Go的rsa.PrivateKey结构体包含D、Primes等字段,但私钥文件常以PKCS#1或PKCS#8格式存储。若用x509.ParsePKCS1PrivateKey解析PKCS#8格式的私钥,会直接返回invalid format错误。正确做法是先尝试x509.ParsePKCS8PrivateKey,失败后再 fallback 到 PKCS#1。另外,私钥文件权限必须严格限制(如0600),否则os.Open读取时可能因权限问题静默失败,最终表现为“解密错误”而非“文件不可读”。
AES-GCM 和 RSA 混合使用才是生产级方案
直接用RSA加密原始数据既慢又受限(2048位密钥最多加密214字节)。真实场景中应采用混合加密:crypto/rand.Read生成32字节AES密钥 → 用cipher.NewGCM加密数据 → 用rsa.EncryptOAEP加密该AES密钥。注意两点:GCM的nonce必须唯一且不可复用,建议每次加密生成新nonce并和密文一起序列化;RSA加密后的密钥需Base64编码再存,避免二进制数据损坏。漏掉任意一环,比如复用nonce或AES密钥硬编码,都会让整个加密流程形同虚设。
密钥长度、填充模式、随机源、文件格式、nonce管理——这些点单独看都很小,但组合起来就是安全边界的全部。写完代码后,务必用已知明文+固定密钥跑一次端到端流程,验证加解密可逆性,再检查错误路径是否真能捕获异常。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











