fastapi项目中使用rsa签名前端证书文件如何保存?后端如何实现验签过程
时间: 2024-10-10 14:14:39 浏览: 107
RSA签名验签工具windows_V1.4.zip_rsa_rsa2生成签名_rsa签名工具_工具_验签
5星 · 资源好评率100%
在FastAPI项目中,如果你想要使用RSA签名验证前端发送的证书文件,通常步骤如下:
1. **生成公钥和私钥**:首先,你需要在后端生成一对RSA密钥对,其中一个是公开的公钥(用于加密),另一个是私有的私钥(用于解密和签名)。可以使用Python的`cryptography`库来生成。
```python
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import serialization
key_pair = rsa.generate_private_key(public_exponent=65537, key_size=2048)
public_key = key_pair.public_key()
private_pem = private_key.private_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PrivateFormat.PKCS8,
encryption_algorithm=serialization.NoEncryption())
public_pem = public_key.public_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PublicFormat.SubjectPublicKeyInfo)
```
将私钥保存在安全的地方,如环境变量或数据库的敏感区域,公共钥则可以提供给前端。
2. **前端证书文件保存**:前端可以在客户端生成一个包含公钥信息的证书文件(比如`.pem`或`.cer`格式),并将它发送给用户下载。用户将其存储在浏览器的信任凭证目录中,以便后续请求使用。
3. **后端验签过程**:
- 用户发起请求时,携带证书文件(可能是一个包含公钥的PEM文件)作为请求头的一部分。
- 后端从请求头获取证书,然后使用内置的`cryptography`库读取并解析证书中的公钥。
- 使用服务器的私钥对证书内容(通常是某种数据)进行签名,例如可以是HTTP请求体。
- 验证时,后端会计算请求体的哈希值,并使用接收到的公钥对这个哈希进行解密,如果结果与原始哈希一致,则认为认证通过。
```python
import hashlib
from cryptography.hazmat.primitives import hashes, padding
from cryptography.exceptions import InvalidSignature
# 假设request_body是请求体内容
hash_object = hashes.Hash(hashes.SHA256(), backend=default_backend())
hash_object.update(request_body.encode('utf-8'))
message_digest = hash_object.finalize()
try:
public_key.verify(message_digest, signature, padding.PSS(mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH))
# 验证成功
except InvalidSignature:
# 验证失败
```
阅读全文