You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从publicKeyPem可靠推断RSA算法(rsa256/rsa512)

区分RSA256与RSA512签名算法的可靠方案

首先明确:RSA公钥本身只包含模数和指数信息,不直接携带签名时使用的哈希算法(SHA-256/SHA-512),所以无法仅从publicKeyPem直接推导算法。结合你提到的HS2019规范,以下是两种可靠方案:

1. 严格遵循HS2019规范,从keyId关联元数据获取算法

HS2019明确要求,与keyId关联的元数据(比如JWK格式的密钥描述、密钥服务端返回的元数据)必须包含alg字段,该字段会直接标识签名算法(如RS256对应RSA256,RS512对应RSA512)。这是最合规、最可靠的方式,完全符合规范设计意图,避免猜测带来的错误。

2. 无元数据时,通过签名验证反向推导

如果无法获取keyId对应的元数据,只能通过尝试两种算法验证签名来反向判断:

  • 核心逻辑:分别用RS256(SHA-256 + PKCS1v1.5填充)和RS512(SHA-512 + PKCS1v1.5填充)算法验证签名,能通过验证的即为实际使用的算法。
  • 示例代码(Python,基于cryptography库):
from cryptography.hazmat.primitives import hashes, serialization
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.backends import default_backend

def detect_rsa_alg(public_key_pem, signature, raw_data):
    # 加载PEM格式公钥
    pub_key = serialization.load_pem_public_key(
        public_key_pem.encode(),
        backend=default_backend()
    )
    # 尝试RS256验证
    try:
        pub_key.verify(
            signature,
            raw_data.encode(),
            padding.PKCS1v15(),
            hashes.SHA256()
        )
        return "RS256"
    except:
        pass
    # 尝试RS512验证
    try:
        pub_key.verify(
            signature,
            raw_data.encode(),
            padding.PKCS1v15(),
            hashes.SHA512()
        )
        return "RS512"
    except:
        pass
    return None
  • 注意:此方法依赖有效的签名和原始待签名数据,若签名无效或数据篡改,会返回None,仅作为规范方案的 fallback 选项。

为什么签名长度判断不可行

你之前测试的结论是对的:RSA签名的长度等于公钥模数的长度(比如2048位RSA的签名固定为256字节),与签名时使用的哈希算法无关——因为哈希值会被填充到模数长度后再用私钥加密,所以签名长度无法区分SHA-256和SHA-512。

内容的提问来源于stack exchange,提问作者MediaFormat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 10:10:17