首页 > 解决方案 > 没有 ASN.1 编码的 Python 中的数字签名?

问题描述

我们需要生成一个没有ASN.1 编码的数字签名,以供下游应用程序验证。我们可以通过以下方式在命令行上使用 openssl 执行此操作:

openssl pkeyutl -sign -inkey keyfile < hash

但是,当我尝试在 Python 中进行数字签名(使用 PyCrypto 库)时,如果没有包含 ASN.1 编码的库,我将无法这样做(也就是说,除非我派生 PyCrypto 以允许我删除它们)。rsa 库也不允许这样做。是否有任何我错过的 Python 加密库或命令允许这种灵活性?

标签: pythonopensslrsadigital-signatureasn.1

解决方案


根据此答案,您显示的 OpenSSL 命令会生成一个RSASSA-PKCS1-v1_5签名,根据定义,该签名始终包含 ASN.1 DER 编码结构:您的假设并不真正有效。

但是,当哈希算法固定时,接收方没有必要也不建议实现完整的 DER 解析器。它可以只检查某个字节字符串是否存在(以及一些其他填充字节,并且在检查最右边位置的摘要之前)。这个另一个答案显示了最流行的摘要算法的 DER 编码。

如果你真的不想在你的签名中有 ASN.1,你只能切换到RSASSA-PSS.


推荐阅读