使用BouncyCastle库(虽然我猜这个库有点不相关)时,我经常遇到指定为ASN.1标识符的算法ID。例如,证书的签名算法可能是"1.2.840.113549.1.1.11"
。
是否有一种适当的方法将其转换为某种人类可读形式,而不涉及查找我可以获取的每个ID并手动构建巨大的查找表?
使用BouncyCastle库(虽然我猜这个库有点不相关)时,我经常遇到指定为ASN.1标识符的算法ID。例如,证书的签名算法可能是"1.2.840.113549.1.1.11"
。
是否有一种适当的方法将其转换为某种人类可读形式,而不涉及查找我可以获取的每个ID并手动构建巨大的查找表?
org.bouncycastle.operator.DefaultAlgorithmNameFinder
。但是 - 如果我没记错的话 - 这只在较新版本中引入(我正在使用Bouncy Castle 1.57 - 我还检查了1.46,它没有这个类)。DefaultAlgorithmNameFinder algFinder = new DefaultAlgorithmNameFinder();
System.out.println(algFinder.getAlgorithmName(new ASN1ObjectIdentifier("1.2.840.113549.1.1.11")));
是的。就是这个:org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers.sha256WithRSAEncryption。
有关扩展,请参阅org.bouncycastle.asn1.x509.Extension ASN1ObjectIdentifier列表。
我认为没有其他方法,只能建立一个映射表。每个加密库都这样做,例如 OpenSSL、.NET Framework、BouncyCastle 等。
问题是,每个库可能会(并经常)将相同的 OID 分配给不同的 FriendlyName
。例如,Openssl 使用 emailAddress
,而 .NET 则将其翻译为 E
。
BouncyCastle 已经实现了这个映射表(抱歉,这里是 C# 版本链接)here(也可能在其他地方)。
sha256WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 11 }
所以您的ASN.1解析器理论上可以为您自动构建查找表。oid.name
不必通过查找表运行 OID:
name = gigantic_oid2name_map[oid]