如何从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
相关产品推荐
相关产品推荐

