扫描二维码
关注或者微信搜一搜:编程智域 前端至全栈交流与成长
发现1000+提升效率与开发的AI工具和实用程序:https://tools.cmdragon.cn/
通过Field函数的description参数声明敏感字段:
from pydantic import BaseModel, Field
class User(BaseModel):
username: str
password: str = Field(..., description="敏感字段-用户密码")
phone: str = Field(..., example="138****7890")
使用SecretStr类型自动隐藏敏感数据:
from pydantic import SecretStr
class SafeUser(BaseModel):
api_key: SecretStr
db_password: SecretStr
# 输出时将自动转为********
print(SafeUser(api_key="sk-1234", db_password="db@123").json())
# 输出:{"api_key": "**********", "db_password": "**********"}
class SensitiveModel(BaseModel):
class Config:
json_encoders = {
SecretStr: lambda v: "*******" if v else None
}
exclude_fields = ['password']
流程图说明:
class UserResponse(BaseModel):
username: str
email: str
@app.get("/users/me", response_model=UserResponse)
async def read_user_me():
return current_user.dict()
from fastapi import Depends
def mask_sensitive_data(user: User):
return user.dict(exclude={"password", "ssn"})
@app.get("/users/{id}")
async def get_user(data: dict = Depends(mask_sensitive_data)):
return data
from typing import Optional
class DynamicResponse(BaseModel):
name: str
phone: Optional[str]
email: Optional[str]
@classmethod
def create_with_mask(cls, user: User, is_admin: bool):
fields = user.dict()
if not is_admin:
fields.update({"phone": "138****7890", "email": "***@example.com"})
return cls(**fields)
流程图说明:
graph TD A[原始数据] --> B{权限判断} B -->|通过| C[字段替换] B -->|拒绝| D[返回错误] C --> E[响应输出] D --> E
import hvac
vault_client = hvac.Client(
url="http://vault:8200",
token="s.4zNq3Z8gKj9R6tY1"
)
def encrypt_data(data: str) -> str:
return vault_client.secrets.transit.encrypt_data(
name="fastapi-key",
plaintext=data.encode()
)["data"]["ciphertext"]
from pydantic import validator
class EncryptedUser(User):
@validator('password', pre=True)
def encrypt_password(cls, v):
return encrypt_data(v)
graph TD A[客户端请求] --> B[参数验证] B --> C{敏感字段判断} C -->|是| D[Vault加密] C -->|否| E[直接存储] D --> F[数据库保存] E --> F
当需要在前端显示用户手机号时,应该使用哪种脱敏方式?
A) 完全显示
B) 中间四位星号
C) 全部加密
D) 随机替换
答案:B
答案解析:根据PCI DSS规范要求,敏感信息需要部分隐藏但保持可识别性
以下哪项是Vault的核心功能?
A) 自动生成API文档
B) 动态密钥管理
C) 请求速率限制
D) 数据库迁移
答案:B
答案解析:Vault提供加密即服务、密钥轮换等安全功能
现象:
{"detail":[{"loc":["body","password"],"msg":"field required","type":"value_error.missing"}]}
解决方法:
from fastapi import HTTPException
from pydantic import ValidationError
@app.post("/users")
async def create_user(data: dict):
try:
return User(**data)
except ValidationError as e:
raise HTTPException(422, detail=e.errors())
现象:hvac.exceptions.VaultDown: Unable to connect to Vault server
排查步骤:
vault statustelnet vault 8200vault token renew环境配置:
pip install fastapi==0.68.0 pydantic==1.8.2 python-multipart==0.0.5 hvac==0.11.2
代码验证方法:
import pytest
from fastapi.testclient import TestClient
client = TestClient(app)
def test_sensitive_masking():
response = client.get("/users/1")
assert "****" in response.json()["phone"]
以上内容通过实际案例演示了从字段标记到加密集成的完整数据脱敏流程,采用符合行业标准的安全实践,建议在生产环境中配合HTTPS和访问日志审计共同使用。
余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:编程智域 前端至全栈交流与成长
,阅读完整的文章:如何在FastAPI中巧妙玩转数据脱敏,让敏感信息安全无忧?
登录查看全部
参与评论
手机查看
返回顶部