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

如何在Django表单/Crispy Forms中实现前后端加密解密?是否有Python包

Django表单字段加密解密的现成组件与实现方案

可用的Python包

  • django-cryptography:自带Fernet加密实现,可快速扩展为表单字段组件,搭配前端Fernet JS库就能完成前后端加密解密联动。它原本用于模型字段加密,但很容易封装成表单字段,省去自定义加密逻辑的麻烦。
  • django-encrypted-model-fields:主打模型字段加密,但可以基于它的加密逻辑封装表单字段,支持AES等多种算法,适配不同的前端加密库。

基于django-cryptography的实现步骤

1. 安装依赖

pip install django-cryptography

2. 自定义加密表单字段

继承Django原生CharField,重写值处理方法,实现服务器端的解密渲染与加密提交:

from django import forms
from cryptography.fernet import Fernet
import os

# 从环境变量获取密钥,避免硬编码
FERNET_KEY = os.environ.get('FERNET_KEY', Fernet.generate_key())

class EncryptedCharField(forms.CharField):
    def prepare_value(self, value):
        # 服务器端存储的加密值,渲染到前端前解密为明文
        if value and isinstance(value, bytes):
            f = Fernet(FERNET_KEY)
            return f.decrypt(value).decode('utf-8')
        return value

    def clean(self, value):
        # 前端提交的明文,加密后传给后端处理
        cleaned_value = super().clean(value)
        f = Fernet(FERNET_KEY)
        return f.encrypt(cleaned_value.encode('utf-8'))

3. 前端JS配合处理

引入Fernet JS库(可直接下载到本地静态文件目录),在表单提交前加密字段值:

<script src="{% static 'js/fernet.js' %}"></script>
<script>
const fernetKey = "{{ FERNET_KEY.decode('utf-8') }}";
const fernet = new Fernet(fernetKey);

// 拦截表单提交事件,加密目标字段
document.getElementById('encrypted-form').addEventListener('submit', function(e) {
    const targetInput = document.getElementById('id_encrypted_field');
    targetInput.value = fernet.encode(targetInput.value);
});
</script>

关键注意事项

  • 密钥必须前后端一致,且通过环境变量、密钥管理服务等方式安全存储,绝对不能硬编码到代码或前端页面中。
  • 必须使用HTTPS协议传输,即使字段加密,HTTP传输仍存在被劫持篡改的风险。
  • 若使用其他加密算法(如AES),需确保前后端使用相同的模式(如CBC)、填充方式和密钥长度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 12:21:48