【发布时间】:2017-09-19 03:16:34
【问题描述】:
使用 BouncyCastle 库(尽管我猜该库有点不相关)我经常遇到指定为 ASN.1 标识符的算法 ID。例如,证书的签名算法可能是"1.2.840.113549.1.1.11"。
是否有适当的方法将其转换为某种人类可读的形式,不涉及找到我可以得到的每个 ID 并手动构建一个巨大的查找表? p>
【问题讨论】:
标签: java bouncycastle asn.1
使用 BouncyCastle 库(尽管我猜该库有点不相关)我经常遇到指定为 ASN.1 标识符的算法 ID。例如,证书的签名算法可能是"1.2.840.113549.1.1.11"。
是否有适当的方法将其转换为某种人类可读的形式,不涉及找到我可以得到的每个 ID 并手动构建一个巨大的查找表? p>
【问题讨论】:
标签: java bouncycastle asn.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 中找不到任何东西,因此唯一的选择似乎是大查找表。
【讨论】:
恕我直言,除了构建映射表之外别无他法。每个加密库都这样做,即。 Openssl、.NET 框架、BouncyCastle 等。
问题是,每个库都可以(并且经常)将不同的FriendlyName 分配给相同的 OID。例如,Openssl 有 emailAddress,而 .NET 将其翻译为 E。
BouncyCastle 已经实现了这个映射表(对不起 c# 版本链接)here(可能在其他地方)。
【讨论】:
是否有适当的方法可以将其转换为某种人类可读的形式,而不涉及找到我可以得到的每个 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]
【讨论】:
是的。就是这个:org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers.sha256WithRSAEncryption。
扩展见org.bouncycastle.asn1.x509.ASN1ObjectIdentifier的扩展列表。
【讨论】: