欢迎访问宙启技术站
智能推送

突破Python中cryptography.exceptions.InvalidSignature(无效签名)异常的方法

发布时间:2023-12-29 13:25:55

在Python中,cryptography库提供了一种安全的加密方法,可以用于生成和验证数字签名。当使用数字签名进行验证时,如果发现签名是无效的,就会引发InvalidSignature异常。

要突破InvalidSignature异常,可以根据实际需求采取以下几种方法:

1. 确认密钥和算法:首先,你需要确认使用的密钥和算法是正确的。检查密钥是否与签名的生成方一致,并确保使用的算法与签名的验证方相匹配。例如,如果签名是使用RSA算法生成的,那么验证方也必须使用RSA算法进行验证。

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

# 签名方生成签名
private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048,
    backend=default_backend()
)
message = b"Message to be signed"
signature = private_key.sign(
    message,
    padding.PSS(
        mgf=padding.MGF1(hashes.SHA256()),
        salt_length=padding.PSS.MAX_LENGTH
    ),
    hashes.SHA256()
)

# 验证方验证签名
public_key = private_key.public_key()
try:
    public_key.verify(
        signature,
        message,
        padding.PSS(
            mgf=padding.MGF1(hashes.SHA256()),
            salt_length=padding.PSS.MAX_LENGTH
        ),
        hashes.SHA256()
    )
    print("Signature is valid")
except cryptography.exceptions.InvalidSignature:
    print("Signature is invalid")

2. 检查消息完整性:如果签名验证失败,可能是消息被篡改了。你可以通过比较消息的摘要(hash)来检查消息是否完整。在生成签名之前,你可以先对消息进行哈希处理,将其转换为固定长度的摘要,然后将摘要与签名一起进行验证。

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

# 签名方生成签名
private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048,
    backend=default_backend()
)
message = b"Message to be signed"
digest = hashes.Hash(hashes.SHA256(), backend=default_backend())
digest.update(message)
message_digest = digest.finalize()
signature = private_key.sign(
    message_digest,
    padding.PSS(
        mgf=padding.MGF1(hashes.SHA256()),
        salt_length=padding.PSS.MAX_LENGTH
    ),
    hashes.SHA256()
)

# 验证方验证签名
public_key = private_key.public_key()
try:
    public_key.verify(
        signature,
        message_digest,
        padding.PSS(
            mgf=padding.MGF1(hashes.SHA256()),
            salt_length=padding.PSS.MAX_LENGTH
        ),
        hashes.SHA256()
    )
    print("Signature is valid")
except cryptography.exceptions.InvalidSignature:
    print("Signature is invalid")

3. 检查密钥文件和数据类型:确保密钥文件是正确的格式,例如PEM或DER。还要确保密钥和签名的数据类型是一致的。例如,如果密钥是从PEM文件加载的,那么验证时也需要将签名数据从PEM文件加载。

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

# 签名方生成签名
private_key_pem = b"..."
private_key = serialization.load_pem_private_key(
    private_key_pem,
    password=None,
    backend=default_backend()
)
message = b"Message to be signed"
signature_pem = private_key.sign(
    message,
    padding.PKCS1v15(),
    hashes.SHA256()
)
signature = serialization.load_pem_private_key(
    signature_pem,
    password=None,
    backend=default_backend()
)

# 验证方验证签名
public_key_pem = b"..."
public_key = serialization.load_pem_public_key(
    public_key_pem,
    backend=default_backend()
)
try:
    public_key.verify(
        signature,
        message,
        padding.PKCS1v15(),
        hashes.SHA256()
    )
    print("Signature is valid")
except cryptography.exceptions.InvalidSignature:
    print("Signature is invalid")

总结起来,要突破Python中的InvalidSignature异常,首先要确认密钥和算法是否正确,其次要检查消息的完整性,最后还要确保密钥文件和数据类型的一致性。以上示例提供了三种可能的方法,你可以根据实际情况选择适合自己的方法。