数字签名是一种用于验证数据完整性和来源身份的技术。它基于公钥密码学,允许数据的发送方使用其私钥对数据进行签名,而接收方则可以使用发送方的公钥来验证签名的有效性。

本文涉及的产品
MSE Nacos/ZooKeeper 企业版试用,1600元额度,限量50份
函数计算FC,每月15万CU 3个月
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
简介: 数字签名是一种用于验证数据完整性和来源身份的技术。它基于公钥密码学,允许数据的发送方使用其私钥对数据进行签名,而接收方则可以使用发送方的公钥来验证签名的有效性。

一、数字签名简介

数字签名是一种用于验证数据完整性和来源身份的技术。它基于公钥密码学,允许数据的发送方使用其私钥对数据进行签名,而接收方则可以使用发送方的公钥来验证签名的有效性。数字签名的主要目的是确保数据的完整性(数据在传输过程中未被篡改)和来源的真实性(数据确实来自声称的发送者)。

二、Python中的cryptography模块

cryptography是一个Python库,提供了各种密码学原语和实用程序,包括数字签名。它支持多种加密算法和哈希函数,并且易于使用。

三、数字签名流程

  1. 选择算法:首先,您需要选择一种适合您需求的签名算法。常见的签名算法包括RSA、ECDSA等。
  2. 生成密钥对:使用所选算法生成一个公钥和一个私钥。私钥用于签名数据,而公钥用于验证签名。
  3. 签名数据:使用私钥和哈希函数对要签名的数据进行签名。这通常涉及计算数据的哈希值,然后使用私钥对哈希值进行加密。
  4. 验证签名:接收方收到签名数据后,使用公钥和相同的哈希函数来验证签名。这涉及重新计算数据的哈希值,然后使用公钥解密签名中的哈希值,并比较两者是否相同。

四、Python代码示例

下面是一个使用RSA算法进行数字签名的Python代码示例:

from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives.serialization import load_pem_private_key, load_pem_public_key
from cryptography.exceptions import InvalidSignature
from os import urandom

# 假设您已经有了PEM格式的私钥和公钥文件
PRIVATE_KEY_FILE = 'private_key.pem'
PUBLIC_KEY_FILE = 'public_key.pem'

# 加载私钥和公钥
with open(PRIVATE_KEY_FILE, 'rb') as key_file:
    private_key = load_pem_private_key(
        key_file.read(),
        password=None,  # 如果私钥有密码,请在此处提供
    )

with open(PUBLIC_KEY_FILE, 'rb') as key_file:
    public_key = load_pem_public_key(key_file.read())

# 要签名的数据
data = b'This is a message to be signed.'

# 签名数据
signature = private_key.sign(
    data,
    padding.PSS(
        mgf=padding.MGF1(hashes.SHA256()),
        salt_length=padding.PSS.MAX_LENGTH
    ),
    hashes.SHA256()
)

# 验证签名
try:
    public_key.verify(
        signature,
        data,
        padding.PSS(
            mgf=padding.MGF1(hashes.SHA256()),
            salt_length=padding.PSS.MAX_LENGTH
        ),
        hashes.SHA256()
    )
    print("Signature is valid!")
except InvalidSignature:
    print("Invalid signature!")

# 生成随机数据并签名(用于演示)
random_data = urandom(32)
random_signature = private_key.sign(
    random_data,
    padding.PSS(
        mgf=padding.MGF1(hashes.SHA256()),
        salt_length=padding.PSS.MAX_LENGTH
    ),
    hashes.SHA256()
)

# 尝试使用错误的公钥验证签名(应该失败)
try:
    # 假设我们有一个错误的公钥
    wrong_public_key = ...  # 这里应该加载一个不同的公钥
    wrong_public_key.verify(
        random_signature,
        random_data,
        padding.PSS(
            mgf=padding.MGF1(hashes.SHA256()),
            salt_length=padding.PSS.MAX_LENGTH
        ),
        hashes.SHA256()
    )
    print("This should not happen! (But it did...)")
except InvalidSignature:
    print("Signature verification failed as expected.")

五、代码解释

  1. 导入必要的模块和函数:我们从cryptography模块中导入了进行数字签名所需
    处理结果:

    一、数字签名简介

    数字签名是一种用于验证数据完整性和来源身份的技术。它基于公钥密码学,允许数据的发送方使用其私钥对数据进行签名,而接收方则可以使用发送方的公钥来验证签名的有效性。数字签名的主要目的是确保数据的完整性(数据在传输过程中未被篡改)和来源的真实性(数据确实来自声称的发送者)。

    二、Python中的cryptography模块

    cryptography是一个Python库,提供了各种密码学原语和实用程序,包括数字签名。它支持多种加密算法和哈希函数,并且易于使用。

    三、数字签名流程

  2. 选择算法:首先,您需要选择一种适合您需求的签名算法。常见的签名算法包括RSA、ECDSA等。
    生成密钥对:使用所选算法生成一个公钥和一个私钥。私钥用于签名数据,而公钥用于验证签名。
    签名数据:使用私钥和哈希函数对要签名的数据进行签名。这通常涉及计算数据的哈希值,然后使用私钥对哈希值进行加密。
    验证签名:接收方收到签名数据后,使用公钥和相同的哈希函数来验证签名。这涉及重新计算数据的哈希值,然后使用公钥解密签名中的哈希值,并比较两者是否相同。

    四、Python代码示例

    下面是一个使用RSA算法进行数字签名的Python代码示例:
    ```python

    假设您已经有了PEM格式的私钥和公钥文件

    加载私钥和公钥

    private_key = load_pem_private_key(
    key_file.read(),
    password=None, # 如果私钥有密码,请在此处提供
    )
    with open(PUBLIC_KEY_FILE, 'rb') as keyfile
    public_key = load_pem_public_key(key_file.read())

    要签名的数据

    签名数据

    data,
    padding.PSS(
    mgf=padding.MGF1(hashes.SHA256()),
    salt_length=padding.PSS.MAX_LENGTH
    ),
    hashes.SHA256()

    验证签名

    public_key.verify(
    signature,
    data,
    padding.PSS(
    mgf=padding.MGF1(hashes.SHA256()),
    salt_length=padding.PSS.MAX_LENGTH
    ),
    hashes.SHA256()
    )
    print("Signature is valid!")
    print("Invalid signature!")

    生成随机数据并签名(用于演示)

    random_data,
    padding.PSS(
    mgf=padding.MGF1(hashes.SHA256()),
    salt_length=padding.PSS.MAX_LENGTH
    ),
    hashes.SHA256()

    尝试使用错误的公钥验证签名(应该失败)

    假设我们有一个错误的公钥

    wrong_public_key = ... # 这里应该加载一个不同的公钥
    wrong_public_key.verify(
    random_signature,
    random_data,
    padding.PSS(
    mgf=padding.MGF1(hashes.SHA256()),
    salt_length=padding.PSS.MAX_LENGTH
    ),
    hashes.SHA256()
    )
    print("This should not happen! (But it did...)")
    print("Signature verification failed as expected.")
  3. 导入必要的模块和函数:我们从cryptography模块中导入了进行数字签名所需
相关文章
|
算法 安全 关系型数据库
密码学系列之七:数字签名
密码学系列之七:数字签名
1576 0
|
安全 网络安全 区块链
软件体系结构 - 数字签名
软件体系结构 - 数字签名
206 1
|
3月前
|
SQL 人工智能 数据可视化
开源AI BI可视化工具-WrenAI
Wren AI 是一款开源的 SQL AI 代理,支持数据、产品及业务团队通过聊天、直观界面和与 Excel、Google Sheets 的集成获取洞察。它结合大型语言模型(LLM)与检索增强生成(RAG)技术,助力用户高效处理复杂数据分析任务。
|
机器学习/深度学习 人工智能 Java
验证码破解全流程实战
验证码破解全流程实战
776 0
验证码破解全流程实战
|
7月前
|
机器学习/深度学习 人工智能 自然语言处理
3步,0代码!一键部署DeepSeek-V3、DeepSeek-R1
3步,0代码!一键部署DeepSeek-V3、DeepSeek-R1
254 0
|
10月前
|
存储 人工智能 缓存
【AI系统】Ascend C 语法扩展
Ascend C 是基于标准 C++ 扩展的编程语言,专为华为昇腾处理器设计。本文介绍了 Ascend C 的基础语法扩展、API(基础与高阶)、关键编程对象(数据存储、任务间通信与同步、资源管理及临时变量),以及如何利用这些特性高效开发。通过华为自研的毕昇编译器,Ascend C 实现了主机与设备侧的独立执行能力,支持不同地址空间的访问。API 包括计算、数据搬运、内存管理和任务同步等功能,旨在帮助开发者构建高性能的 AI 应用。
280 2
【AI系统】Ascend C 语法扩展
|
11月前
|
算法 安全 物联网
关于SM2、SM3、SM4、SM9这四种国密算法
本文介绍了四种国密算法——SM2、SM3、SM4和SM9。SM2是一种基于椭圆曲线的非对称加密算法,用于数据加密和数字签名;SM3是哈希算法,用于数字签名和消息完整性验证;SM4是对称加密算法,用于数据加密和解密;SM9是基于标识的非对称密码算法,适用于物联网环境中的数据安全和隐私保护。
7669 0
|
人工智能 语音技术
ModuleNotFoundError: AutomaticSpeechRecognitionPipeline: No module named ‘funasr‘
这篇文章描述了在运行阿里语音AI模型的语音识别时遇到的`ModuleNotFoundError: No module named ‘funasr’`错误,并提供了通过`pip install funasr --upgrade -f https://modelscope.oss-cn-beijing.aliyuncs.com/releases/repo.html`命令重新安装funasr模块的解决方法。
ModuleNotFoundError: AutomaticSpeechRecognitionPipeline: No module named ‘funasr‘
|
机器学习/深度学习 算法 算法框架/工具
模型训练实战:选择合适的优化算法
【7月更文第17天】在模型训练这场智慧与计算力的较量中,优化算法就像是一位精明的向导,引领着我们穿越复杂的损失函数地形,寻找那最低点的“宝藏”——最优解。今天,我们就来一场模型训练的实战之旅,探讨两位明星级的优化算法:梯度下降和Adam,看看它们在不同战场上的英姿。
362 5