近期工作涉及支付宝接入,查看开放平台文档时,发现应用私钥有 Java 格式和非 Java 格式之分。这两种格式究竟有什么区别?
一、为什么要区分两种格式?
支付宝开放平台提供不同的密钥格式选项,主要是为了适配不同 SDK 的密钥解析方式。历史接入文档中,Java 开发者通常需要使用 PKCS#8 格式,而 PHP 等语言的开发者可以使用 PKCS#1 格式。
这两种格式的区别在于私钥的编码结构,而不是安全等级或支付权限不同。
二、两种格式有什么区别?
PKCS#1 是 RSA 密钥的专用结构,直接保存 RSA 私钥参数;PKCS#8 则是通用私钥信息格式,外层包含算法标识和私钥数据。
| 格式 | 常见 PEM 文件头 | 结构特点 |
|---|---|---|
| PKCS#1 | BEGIN RSA PRIVATE KEY |
直接保存 RSA 私钥参数 |
| PKCS#8 | BEGIN PRIVATE KEY |
包含算法标识和私钥数据 |
需要注意,PEM 是文本封装形式,PKCS#1 和 PKCS#8 是密钥结构规范,三者不能混为一谈。
Java、Go、Python 等语言并非只能使用某一种格式。具体能否直接加载某种格式,取决于语言的加密库、SDK 的实现及其输入要求。支付宝区分 Java 与非 Java 格式,主要是为了降低开发者的接入成本。
三、接入时应该如何选择?
选择密钥时,应优先遵循所使用的支付宝 SDK 文档要求,而不是仅根据编程语言名称判断。如果 SDK 要求 PKCS#8,就应提供对应格式的私钥;如果支持 PKCS#1,也可以使用相应格式。
此外,私钥格式与证书模式是两个不同的概念。支付宝支持普通公钥模式和公钥证书模式,两者在公钥配置、证书文件及验签方式上有所区别。接入时应确保应用配置、密钥文件和 SDK 使用的模式一致,并妥善保管应用私钥,避免泄露。