【发布时间】:2018-11-09 12:07:39
【问题描述】:
背景
我使用 openssl SHA256 和私钥签署了一个文件,如下所示:
with subprocess.Popen(
# Pipe the signature to openssl to convert it from raw binary encoding to base64 encoding.
# This will prevent any potential corruption due to line ending conversions, and also allows
# a human to read and copy the signature (e.g. for manual verification).
'openssl dgst -sha256 -sign private.key sign_me.zip | openssl base64 > signature.sha256',
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
shell=True,
) as proc:
out, _ = proc.communicate()
要求
- 我需要使用
signature.sha256和public_key.crt来验证sign_me.zip没有被修改。 - 兼容 Python 3.2 - 3.4
- 需要同时在 Windows 和 Redhat 上工作,并且不保证 OpenSSL 将在路径上或在已知位置。理想情况下,我想使用核心 Python 模块,但如果它可以降低复杂性,我会考虑使用 3rd 方模块。
我的尝试
我做了很多搜索,试图弄清楚如何做到这一点,但我一直未能找到令人满意的答案。以下是我尝试和/或研究过的事情的清单:
-
我可以通过以下 shell 命令手动验证签名。由于要求 3,这不能作为永久解决方案。
openssl dgst -sha256 -verify <(openssl x509 -in public_key.crt -pubkey -noout) -signature signature.sha256 sign_me.zip 我找到了this question,这几乎正是我想要做的。近 2 年没有人回答,甚至没有评论。它提到了ssl python library,它主要处理客户端/服务器证书和套接字。
-
This question 似乎使用加密库来验证“SHA256withRSA and PKCS1 padding”签名。不幸的是,它针对的是 Python 2.7,此外,我无法在问题引用的 Python 2.7 crypto 模块中找到
verify()方法文档。 - 我还发现了一个名为cryptography 的第三方模块。 Stack Overflow 上的共识似乎是,这是用于加密等的最新/最好的模块,但我无法找到符合我要求的文档。
也许我遗漏了一些明显的东西?我在安全/加密/散列方面没有做太多工作,因此欢迎提供反馈。
【问题讨论】:
-
查看cryptography.io/en/latest/hazmat/primitives/asymmetric/rsa 的“验证”部分。或“非对称算法”下的其他情况。在能够使用
verify()之前,您将需要一些管道来从字符串/文件中构造适当的对象。 -
这里是另一个选项:gist.github.com/lkdocs/6519372
-
如果您想减少错误和互操作性问题,您应该使用用于验证它的相同工具生成签名。
-
核心 Python 模块依赖于 OpenSSL 库(OpenSSL 必须安装在系统上才能工作) .对于 Win,OpenSSL 库静态链接在 Python 模块内。我倾向于认为其他 3rd 方模块的情况是一样的。
标签: python-3.x ssl openssl cryptography sha256