一、名词定义
- P1 签名:PKCS#1 v1.5 签名(RSASSA-PKCS1-v1_5) 标准:RFC3447,RSA 标准签名格式 签名流程: 原始报文 → Hash 摘要 → EMSA-PKCS1-v1_5 填充 → ASN.1 封装(内置哈希算法 OID)→ RSA 私钥运算
补充:ECDSA 标准 DER 签名,逻辑上可以类比 P1,属于带封装标准签名。
- 裸签 Raw Signature 无填充、无 ASN.1 标签、不携带任何算法标识,只输出原始数值二进制。 分为两类:
- RSA 裸签:直接使用摘要运算,存在伪造漏洞,禁止商用
- ECDSA/SM2 裸签:r、s 直接拼接
r||s(secp256r1 固定 64 字节),物联网、车联网常用
⚠️ 行业误区提醒: 部分厂商文档把 PKCS#1 俗称 "裸签",这只是口头叫法,不等于密码学标准 Raw 裸签,对接以接口字段说明为准。
二、核心对比
表格
| 对比维度 | P1 签名(PKCS#1) | Raw 裸签 |
|----------|----------------------------|------------------------------|---|--------|
| 封装结构 | 包含 PKCS1 填充 + ASN.1 结构 | 无填充、无 ASN.1 封装头 |
| 算法信息 | 内置哈希 OID,可自动识别哈希算法 | 无算法标识,收发双方提前约定哈希算法 |
| 数据内容 | 填充块 + 哈希 OID + 消息摘要 | RSA:原始哈希摘要;ECC:r 值 + s 值直接拼接 |
| 长度特征 | RSA 密钥定长(2048 密钥 = 256 字节) | ECC P256 固定 64 字节 |
| 框架支持 | 通用标准,JDK、BC、OpenSSL 原生支持 | 属于自定义二进制格式,跨平台极易不兼容 |
| 安全特性 | 标准规范,安全可靠 | RSA 裸签高危;ECC 裸签数学安全,仅编码易不匹配 |
| 常见编码 | Base64 (PKCS1 二进制) | Base64(r | | s)原始字节 |
三、ECC 开发重点(高频考点)
SHA256withECDSA默认输出:DER 格式签名(标准封装,对标 RSA 的 P1)- ECDSA 裸签:剥离 DER 标签,直接拼接 r、s 二进制
- 重要结论:DER 签名 ≠ Raw 裸签,二者无法直接互验,必须格式转换
四、速记口诀
P1 签名:带填充、带 OID,标准通用; Raw 裸签:纯原始数值,无封装,算法靠约定。
五、工程避坑要点
- RSA 业务一律使用 PKCS#1,禁止使用 Raw 裸签;
- ECDSA 对接第三方,优先确认签名格式:DER 还是 64 字节 r+s 裸签;
- 裸签没有内置算法信息,验签代码必须显式指定哈希算法;
- 区分文档俗称与标准术语,联调优先索要样例报文验证。