必须用crypto/rand.reader,禁用math/rand;密钥长度限1024/2048/3072/4096;加密须选encryptpkcs1v15或encryptoaep;明文长度≤pub.size()−11;pem解析不可跳过x509步骤。

rsa.GenerateKey 必须传 crypto/rand.Reader,不能用 math/rand
私钥安全性完全依赖随机源。用 math/rand 生成的密钥可预测,哪怕只在测试环境运行一次,也会让整个加密链路失效。常见错误是写成 rand.New(rand.NewSource(time.Now().UnixNano())),这会导致 crypto/rsa: invalid prime: not prime 或更隐蔽的解密失败。
-
rsa.GenerateKey第一个参数必须是crypto/rand.Reader,全局唯一安全选择 - 密钥长度只能是
1024、2048、3072、4096;传2000会 panic - 生产环境别用
1024,TLS 已弃用;推荐直接上3072或4096 - 生成的
*rsa.PrivateKey自带PublicKey字段,无需额外提取
公钥加密必须选 EncryptPKCS1v15 或 EncryptOAEP,不能裸调用
RSA 不允许 textbook 加密(即无填充),Go 标准库直接禁止。加密函数必须显式指定填充方案,否则编译不报错但运行时 panic。
-
EncryptPKCS1v15兼容性好,但明文长度上限硬性为publicKey.Size() - 11字节(如 2048 位密钥最多加密 245 字节) -
EncryptOAEP更安全,但要求两端哈希函数(如sha256.New())和 label(如[]byte("auth"))完全一致 - 别把私钥误传给加密函数——
EncryptPKCS1v15要求*rsa.PublicKey,传*rsa.PrivateKey会 panic - 中文或 JSON 字符串要先转
[]byte再测长度,UTF-8 下一个汉字占 2~3 字节
私钥解密失败九成是密钥加载或密文还原出错
crypto/rsa: decryption error 是通用错误,不透露具体原因。实际调试中,几乎全是以下三类问题:
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
- PEM 解析漏头尾:私钥必须含
-----BEGIN RSA PRIVATE KEY-----或-----BEGIN PRIVATE KEY-----,且要用对应函数解析——x509.ParsePKCS1PrivateKey对前者,pkcs8.ParsePrivateKey对后者 - 密文被 base64 编码后没还原:前端收到
EncryptPKCS1v15输出的[]byte后做了base64.StdEncoding.EncodeToString,后端必须先base64.StdEncoding.DecodeString再传入DecryptPKCS1v15 - 类型断言失败:解析 PEM 后得到的是
interface{},必须显式privKey, ok := parsedKey.(*rsa.PrivateKey),否则调用DecryptPKCS1v15会 panic - 加密用 OAEP、解密用 v1.5(或反过来),错误表现完全一样,只能靠日志比对两端代码
别试图用 RSA 加密大文件或长文本
RSA 是为加密小数据设计的,比如 AES 临时密钥、JWT header、短 token。想加密大内容,必须走混合加密路线。
- 直接加密超过
publicKey.Size() - 11字节的明文,必然触发crypto/rsa: message too long - 正确做法:用
crypto/aes随机生成一个 32 字节密钥加密业务数据,再用EncryptPKCS1v15加密这个 AES 密钥 - 密钥长度影响性能:4096 位私钥解密比 2048 位慢 3~4 倍,但对单次 token 场景可忽略
- 导出私钥优先用
x509.MarshalPKCS8PrivateKey,它支持 3072+ 位;MarshalPKCS1PrivateKey已不推荐
密钥长度、填充方式、随机源、字节流还原——这四个点只要有一个没对齐,RSA 就会静默失败或报泛化错误。最容易被忽略的是:PEM 解析后忘了类型断言,以及 base64 编码后忘了还原密文字节。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










