2017-09-19 47 views
4

使用BouncyCastle库(虽然我猜这个库有点不相关),但我经常遇到指定为ASN.1标识符的算法ID。例如,证书的签名算法可能是"1.2.840.113549.1.1.11"获取ASN.1标识符的合理名称

有没有一种合适的方式将其转换成某种人类可读的形式不涉及涉及找到每个ID我可以得到我的手和手动建立一个巨大的查找表?

回答

1

恕我直言没有其他方式比建立一个映射表。每个加密库都这样做,即。 Openssl,.NET框架,BouncyCastle等。

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

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

+0

是的,它们似乎将它跨越多个文件传播给它......一个表用于签名算法,一个表用于关键目的,一个表用于扩展,......目前我正在构建一个巨型从OID - >资源包密钥查找表,然后从那里查找它,但是如果所有想要解释无效证书的应用程序都必须付出很多努力才能向用户显示一个漂亮的对话框,那就太疯狂了。 :/ – Trejkaz

1

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

我用ASN.1的经验是,模块实际上绑定到OID:

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

使您的ASN.1语法分析器理论上可以建立查找表你自动

更方便是,如果你的ASN.1库的对象标识符类型实现将名称附加到OID对象,以使人类将能够提出这样的问题:

oid.name

代替通过查找表运行OID:

name = gigantic_oid2name_map[oid]

+0

我同意,BC至少没有把标准符号名称放入标识符,这太糟糕了。然后,我会拥有完美的价值,我可以打一个前缀和巴姆,我的查找键是用户可读的字符串。 :)也许我会试着问他们是否认为值得添加。 – Trejkaz

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中任何东西,所以唯一的选择似乎是大的查找表。