公钥(Public Key)是 非对称密码学 中可以公开分发的一半密钥材料,用来加密发给私钥持有者的数据、验证 数字签名,或识别某个 私钥 对应的主体。
核心问题
公钥解决的是“如何在不共享秘密的情况下让别人和我建立密码学关系”的问题。它可以公开复制和传播,因此适合放在服务器配置、证书、软件包元数据、设备固件或代码仓库里。
但公钥本身只说明“存在一把对应私钥”,不自动说明“这把公钥属于谁”。因此工程系统还需要指纹、信任链、数字证书、带外确认或内置根公钥来建立信任。
核心机制
公钥和 私钥 成对生成。典型用途有三类:
- 加密:发送方用接收方公钥加密或包裹会话密钥,只有对应私钥能解密。
- 验签:接收方用公钥检查签名是否由对应私钥生成,以及消息是否被篡改。
- 身份绑定:系统把公钥绑定到用户、域名、设备、软件发布者或机构身份。
常见抽象为:
其中 pk 是公钥,M 是消息,\sigma 是签名。公钥常见编码和容器包括 PEM、DER、JWK、SSH public key 和 X.509 数字证书。
以 ECDSA 为例,公钥是曲线点 Q:
Q = dGd 是 私钥,G 是公开基点,dG 是 椭圆曲线标量乘法。验签算法是通用算法,所有设备可以使用同一段 verify 代码;公钥是传给算法的参数,用来指定“只接受哪把私钥签出来的签名”。
如果设备没有内置或配置可信公钥,攻击者可以自己生成一对密钥、用自己的私钥签恶意内容、再用自己的公钥验签通过。公钥的工程作用不是保密,而是作为信任锚告诉设备“只认这一把签名权威”。
工程用途
- HTTPS / TLS:浏览器通过证书链确认服务器公钥属于目标域名。
- 软件更新:客户端内置公钥或根证书,用来 验签 更新包。
- SSH 登录:服务器保存用户公钥,用户用私钥证明自己。
- 设备身份:设备公钥被写入证书或注册表,用于后续认证。
- API 和令牌系统:服务端发布 JWK 公钥集,调用方用它验证令牌签名。
观察指标包括公钥来源、指纹、算法、长度、有效期、撤销状态、用途约束和轮换覆盖。
边界与常见坑
- 公开不等于可信:任何人都能给你一个公钥,关键是确认它属于预期主体。
- 公钥不是秘密:把公钥暴露出来通常不是泄露;把私钥或可签名权限暴露出来才是严重事故。
- 验签成功不等于授权成功:验签只能证明签名和公钥匹配,还要检查主体、用途、时间、权限和撤销状态。
- 不要只信
kid或文件名:密钥 ID 只是查找线索,不是信任证明。 - 公钥轮换需要兼容窗口:旧签名、旧证书和缓存客户端可能仍需要旧公钥验证。