【问题标题】:Why can't openssl verify signature created by Python cryptography library?为什么 openssl 无法验证 Python 密码库创建的签名?
【发布时间】:2019-10-01 23:31:33
【问题描述】:

我已根据此 [1] 链接使用 Python 加密库创建了文件签名。这是我正在使用的 sn-p(我省略了将签名序列化为文件的部分。

>>> from cryptography.hazmat.primitives import hashes
>>> from cryptography.hazmat.primitives.asymmetric import padding
>>> message = b"A message I want to sign"
>>> signature = private_key.sign(
...     message,
...     padding.PSS(
...         mgf=padding.MGF1(hashes.SHA256()),
...         salt_length=padding.PSS.MAX_LENGTH
...     ),
...     hashes.SHA256()
... )

问题是当我尝试使用openssl CLI 验证签名文件时,它失败了:

openssl dgst -sha256 \
> -signature sig.sha256 \
> -verify pubkey.pem \
> -sigopt rsa_padding_mode:pss \
> -sigopt rsa_pss_saltlen:-1 \
> -sigopt rsa_mgf1_md:sha256 \
> myfile
Verification Failure

我不确定这里还有什么要检查的。假设我做的一切都是正确的,我唯一不能 100% 确定的是我的 openssl 标志是否正确。也许它们与密码学中的签名过程设置不匹配?

[1]https://cryptography.io/en/latest/hazmat/primitives/asymmetric/rsa/#signing

编辑:修复是要么完全删除-sigopt rsa_pss_saltlen,要么将其设置为-sigopt rsa_pss_saltlen:-2,它将盐长度设置为基于PSS块结构(根据https://www.openssl.org/docs/man1.0.2/man1/pkeyutl.html)。

【问题讨论】:

  • 通常问题在于消息的编码,例如字节顺序标记,其他编码或行尾。

标签: python openssl cryptography rsa signing


【解决方案1】:

我根据您引用的 Python 加密库创建了以下 sign.py 脚本:

#!/usr/bin/env python

from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding
import sys
import os

with open("./private.pem", "rb") as key_file:
    private_key = serialization.load_pem_private_key( key_file.read(),
        password=None, backend=default_backend())

with open(sys.argv[1], "r") as file_to_sign:
    message = file_to_sign.read()
    message = message.encode()

signature = private_key.sign( message, padding.PSS(
                mgf=padding.MGF1(hashes.SHA256()),
                salt_length=padding.PSS.MAX_LENGTH), hashes.SHA256())
sigfile = "%s.%s" % (os.path.splitext(sys.argv[1])[0] , "sig")
with open(sigfile, "wb") as to_sig_file:
    to_sig_file.write(signature)

然后,我创建了一个文本文件 message.txt,其中包含您的消息并生成了这样的签名:

./sign.py message.txt

这个脚本的输出是文件message.sig中的签名

我能够使用以下 openssl 命令成功验证它:

openssl dgst -sha256 -verify public.pem -signature message.sig -sigopt \
rsa_padding_mode:pss  message.txt
Verified OK

【讨论】:

  • 谢谢。在我从 openssl 命令“-sigopt rsa_pss_saltlen:-1”中删除以下标志后修复。
  • 谢谢这个答案。这拯救了我的一天!
猜你喜欢
  • 1970-01-01
  • 2016-02-08
  • 2012-05-22
  • 1970-01-01
  • 1970-01-01
  • 2012-06-05
  • 2017-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多