rsa.encryptpkcs1v15明文超长会panic,因pkcs#1 v1.5填充要求明文≤pubkey.size()−11字节(如2048位密钥限245字节),须分块加密或改用aes+rsa混合加密。

rsa.EncryptPKCS1v15 会 panic 不是代码写错了,而是明文超长了;aes.NewCipher 报 invalid key size 不是密钥“不够随机”,而是长度根本不对;bcrypt.GenerateFromPassword 返回 invalid cost 往往因为传了 0 或 32 —— 这些都不是配置问题,是参数校验失败的硬性报错。
rsa.EncryptPKCS1v15 明文超长直接 panic 怎么办
RSA 加密不是“拿来就用”的流式操作,它对输入长度有严格数学限制:rsa.EncryptPKCS1v15 要求明文长度 ≤ pubKey.Size() − 11(PKCS#1 v1.5 填充固定占 11 字节)。2048 位密钥对应最大 245 字节,1024 位仅 117 字节。
- 别对原始字符串或 JSON 直接加密——先检查
len(data) ,不满足就分块或换混合方案 - 分块需手动切片+拼接,标准库不提供自动分段;推荐封装成
RsaPubEncrypt函数,每次取pubKey.Size()-11字节加密 - 真正需要加密长数据时,改用混合加密:用
rsa.EncryptPKCS1v15封装一个随机 AES 密钥,再用该密钥 +cipher.NewGCM加密实际 payload - Java/PHP 互通时,确保对方用的是
RSA/ECB/PKCS1Padding,不是 OAEP —— 两者密文不兼容,混用必 panic
aes.NewCipher 报 invalid key size 怎么排查
aes.NewCipher 对密钥长度是“零容忍”的:必须是 16、24 或 32 字节,少 1 字节或多 1 字节都会返回 error。常见错误是把字符串字面量当密钥,比如 []byte("mykey")(7 字节)或 []byte("12345678901234567")(17 字节)。
- 永远检查
aes.NewCipher的 error 返回值,不能忽略;Go 不会帮你截断或补零 - 密钥来源若是字符串,务必用
sha256.Sum256或hmac.New派生出定长密钥,而不是直接[]byte(s) - 若从环境变量读密钥,先做长度校验:
if len(key) != 16 && len(key) != 24 && len(key) != 32 { return errors.New("invalid aes key length") } - CBC 模式下还要额外确认 IV 是 16 字节;GCM 模式则要求 nonce 长度为 12 字节(非必须但强烈推荐),太短或太长都会让
gcm.Seal失败
bcrypt.GenerateFromPassword 报 invalid cost 怎么处理
bcrypt.GenerateFromPassword 的 cost 参数不是“建议值”,是强制范围:必须是 4–31 的整数。传 0、负数、32 或浮点数都会触发 invalid cost 错误。这个值直接影响哈希耗时(cost +1 ≈ 耗时 ×2)。
- 生产环境别用默认值 10,起步设为 12;压测时观察 P95 登录延迟,超过 300ms 就考虑回调到 11
- 从配置文件或 flag 读 cost 后,必须加范围校验:
if cost 31 { return errors.New("invalid bcrypt cost") } - 测试中可设为 4 加速,但禁止和生产共用同一份配置;CI 环境尤其要隔离,避免低因子掩盖性能退化
- 数据库存哈希的字段类型必须是
VARCHAR(60)或更长——bcrypt 哈希固定 60 字节,截断即验证失败
解密后 string(res) 是乱码,但 bytes.Equal 检查通过
这不是加密失败,是 Go 的 string() 强制 UTF-8 解码导致的显示问题。RSA/AES 解密返回的是原始 []byte,如果原数据含非 UTF-8 字节(如二进制 payload、加密中间态、带 BOM 的文本),string(res) 会把非法字节替换成 ,但底层字节完全正确。
- 验证是否真解密成功,只用
bytes.Equal(src, res),别依赖fmt.Println(string(res)) - 若原始数据是字符串,加密前先用
utf8.Valid(src)校验;否则全程用[]byte,传输/打印时走base64.StdEncoding.EncodeToString - 别在加解密流程里混用
string()和[]byte转换,尤其涉及中文、emoji、密文拼接时——一次隐式转换就可能破坏语义安全 - 服务端接收密码等敏感字符串时,立刻做
utf8.Valid检查,非法则拒收;不进哈希也不打日志
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











