You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中为字符串生成数字签名及用私钥实现该操作?

嘿,咱们一步步拆解你关于Python数字签名的两个问题~

1. 为字符串生成数字签名(基础版与带密钥版)

首先得明确:数字签名的核心需求一般分两种——仅验证字符串完整性,或者同时具备不可否认性(只有特定主体能生成签名)。下面对应两种方案:

方案1:生成哈希摘要(无密钥,仅验证完整性)

如果只是想确认字符串有没有被篡改,用Python内置的hashlib库生成哈希摘要就足够了,常用的安全算法比如SHA-256:

import hashlib

def generate_hash_signature(input_str: str) -> str:
    # 先把字符串转成字节流(哈希算法只认字节)
    byte_data = input_str.encode('utf-8')
    # 生成SHA-256哈希对象
    hash_obj = hashlib.sha256(byte_data)
    # 转成十六进制字符串,方便存储和查看
    return hash_obj.hexdigest()

# 示例用法
my_str = "Hello, 数字签名!"
signature = generate_hash_signature(my_str)
print(f"哈希签名: {signature}")

⚠️ 注意:这种签名任何人都能生成,所以只能验证完整性,没法证明是谁生成的。

方案2:HMAC对称密钥签名(带密钥,完整性+不可否认性)

如果需要只有持有共享密钥的人才能生成/验证签名,可以用HMAC(哈希消息认证码),同样用Python标准库就能实现:

import hmac
import hashlib

def generate_hmac_signature(input_str: str, secret_key: bytes) -> str:
    byte_data = input_str.encode('utf-8')
    # 生成HMAC-SHA256签名
    hmac_obj = hmac.new(secret_key, byte_data, hashlib.sha256)
    return hmac_obj.hexdigest()

# 示例用法
secret_key = b"MySuperSafeSecret_123"  # 密钥要保持字节类型,别泄露!
my_str = "Hello, HMAC签名!"
signature = generate_hmac_signature(my_str, secret_key)
print(f"HMAC签名: {signature}")

这种方案适合内部系统之间的身份验证,前提是双方都要妥善保管共享密钥。

2. 使用私钥生成非对称数字签名

这才是真正意义上的数字签名——用私钥签名,其他人用对应的公钥验证,天生具备不可否认性(只有私钥持有者才能生成有效签名)。推荐用Python生态中最安全易用的cryptography库来实现:

第一步:安装cryptography库

先确保你安装了这个库:

pip install cryptography

第二步:生成RSA密钥对(如果没有现成的)

如果还没有私钥,先生成一对RSA密钥(2048位是安全底线,生产环境推荐4096位):

from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization

# 生成私钥
private_key = rsa.generate_private_key(
    public_exponent=65537,  # 固定的安全指数
    key_size=2048
)

# 保存私钥到文件(可选,方便后续复用)
with open("private_key.pem", "wb") as f:
    f.write(private_key.private_bytes(
        encoding=serialization.Encoding.PEM,
        format=serialization.PrivateFormat.PKCS8,
        # 如果要给私钥加密,把下面改成serialization.BestAvailableEncryption(b"你的密码")
        encryption_algorithm=serialization.NoEncryption()
    ))

# 生成对应的公钥
public_key = private_key.public_key()
# 保存公钥到文件(可选,给验证方使用)
with open("public_key.pem", "wb") as f:
    f.write(public_key.public_bytes(
        encoding=serialization.Encoding.PEM,
        format=serialization.PublicFormat.SubjectPublicKeyInfo
    ))

⚠️ 重要提示:私钥一定要妥善保管,绝对不能泄露!生产环境务必给私钥设置密码加密存储。

第三步:用私钥为字符串签名

签名的逻辑是:先对字符串做哈希,再用私钥加密这个哈希值(也就是生成签名):

from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding

def sign_string_with_private_key(input_str: str, private_key) -> bytes:
    byte_data = input_str.encode('utf-8')
    # 生成签名:使用SHA-256哈希,PKCS1v15填充(RSA标准填充方式)
    signature = private_key.sign(
        byte_data,
        padding.PKCS1v15(),
        hashes.SHA256()
    )
    return signature

# 示例用法:用刚才生成的私钥签名
my_str = "Hello, 非对称数字签名!"
signature = sign_string_with_private_key(my_str, private_key)
print(f"签名(原始字节): {signature}")
# 转成十六进制字符串,方便存储或传输
signature_hex = signature.hex()
print(f"签名(十六进制): {signature_hex}")

额外:用公钥验证签名(供参考)

既然生成了签名,肯定需要验证它的有效性,这里附上验证代码,方便你测试:

def verify_signature(input_str: str, signature: bytes, public_key) -> bool:
    byte_data = input_str.encode('utf-8')
    try:
        public_key.verify(
            signature,
            byte_data,
            padding.PKCS1v15(),
            hashes.SHA256()
        )
        return True
    except:
        # 验证失败会抛出异常,直接返回False
        return False

# 验证示例
is_valid = verify_signature(my_str, signature, public_key)
print(f"签名是否有效: {is_valid}")

内容的提问来源于stack exchange,提问作者Roman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:06:44