获得ASN.1标识符的合理名称

时间:2017-09-19 03:16:35

标签: java bouncycastle asn.1

使用BouncyCastle库(虽然我猜这个库是无关紧要的)我经常遇到指定为ASN.1标识符的算法ID。例如,证书的签名算法可能是"1.2.840.113549.1.1.11"

有没有一种正确的方法可以将其转换为某种人类可读的形式,不会涉及找到我可以获得的每个ID并手动构建一个巨大的查找表?

4 个答案:

答案 0 :(得分:1)

除了构建映射表之外,还有其他方法。每个加密库都会这样做,即。 Openssl,.NET框架,BouncyCastle等。

问题是,每个库都可以(并且经常)将不同的FriendlyName分配给相同的OID。例如,Openssl有emailAddress,而.NET将其翻译为E

BouncyCastle实现了这个映射表(抱歉c#版本链接)here(也许在其他地方)。

答案 1 :(得分:1)

  

有没有一种正确的方法可以将其转换为某种人类可读的形式,并不会找到我可以获取的每个ID并手动构建一个巨大的查找表?

我对ASN.1的体验是模块实际上将 name 绑定到OID:

sha256WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 11 }

这样您的ASN.1解析器理论上可以为您自动构建查找表

如果您的ASN.1库的OBJECT IDENTIFIER类型实现将名称附加到OID对象,以便人类能够提出如下问题,那就更方便了:

oid.name

而不是通过查找表运行OID:

name = gigantic_oid2name_map[oid]

答案 2 :(得分:1)

特别是对于签名算法,您可以使用类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")));

输出结果为:

  

SHA256WITHRSA

根据javadoc,如果找不到人性化的名称,它将返回输入中使用的相同OID。

另请注意(如@pepo's answer所述),不同工具之间的人性化名称可能不同。当BouncyCastle返回SHA256WITHRSA时,OID repository website会使用sha256WithRSAEncryption

对于其他OID(例如扩展和其他字段),我在API中找不到任何内容,因此唯一的选择似乎是大查找表。

答案 3 :(得分:1)

是的。就是这个:org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers.sha256WithRSAEncryption。

有关扩展,请参见org.bouncycastle.asn1.x509。AS​​N1ObjectIdentifier的扩展列表。