用python实现数字签名前后端
时间: 2024-12-17 18:12:48 浏览: 13
在Python中实现数字签名通常涉及到使用哈希函数和公钥加密技术。前后端分离的情况下,前端用于收集用户的输入数据并对其进行处理,然后发送给后端进行签名验证。以下是简单的步骤:
**前端部分(JavaScript,假设使用Node.js Express)**:
1. 导入必要的库,如`crypto`或第三方库`cryptography`。
2. 收集用户的数据,例如字符串`message`。
3. 使用后端提供的公钥对数据进行加密(这里我们仅做模拟,实际应用中需要安全地获取公钥):
```javascript
import crypto from 'crypto';
let message = "Your message here";
let publicKeyPEM = "your_public_key.pem"; // 实际上从服务器获取
let hash = crypto.createHash('sha256');
hash.update(message);
let hashDigest = hash.digest('hex');
// 对hash进行RSA加密,生成数字签名
let signer = new crypto.Signature({ algorithm: 'rsa-sha256', padding: crypto.constants.PKCS1v1_5 });
signer.sign(new Buffer(hashDigest), publicKeyPEM);
let signature = signer.toDER().toString('base64');
```
4. 将签名和原始消息一起发送到后端。
**后端部分(Python,假设使用Flask)**:
1. 接收前端发来的数据和签名,比如通过HTTP POST请求。
2. 检查签名是否有效:
```python
from cryptography.hazmat.primitives import serialization, hashes
from cryptography.hazmat.primitives.asymmetric import padding, rsa
from flask import request
def verify_signature(message, signature, privateKeyPEM):
# 解码Base64并转换为字节串
signature_der = base64.b64decode(signature)
# 加载私钥
with open(privateKeyPEM, 'rb') as f:
private_key = serialization.load_pem_private_key(f.read(), password=None)
try:
# 解密签名并计算hash
verified_hash = private_key.verify(
signature_der,
message.encode(),
padding.PSS(mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH),
hashes.SHA256()
)
return True
except (ValueError, InvalidSignature):
return False
received_message = request.form.get('message')
signature = request.form.get('signature')
# ...其他业务逻辑...
if verify_signature(received_message, signature, 'your_private_key.pem'):
print("Signature is valid")
else:
print("Signature verification failed")
```
阅读全文