如何在 Django 中加密和解密访问密码?

How to encrypt and decrypt access passwords in Django?

提问人:adminpaz 提问时间:7/9/2023 更新时间:10/24/2023 访问量:191

问:

我的 Django 应用程序需要一个表来存储不同用户的凭据,以访问存储其信息的外部数据库。不使用 Django 使用的相同数据库是出于安全和技术原因。但是在存储过程中,我想在插入持久性之前加密密码,然后再解密密码以使用它们。

我的第一种方法是使用make_password函数,但我找不到解密密码的方法。

现在,我正在使用一个pre_save脚本测试 django 信号,该脚本使用 cryptographi.fernet 算法加密密码。稍后,这在视图执行中被解密。对于加密和解密,我将密钥保存在设置文件(从环境加载)中。

我想知道这是否足够安全,可以管理用户关键信息的凭据。此外,如果有任何方法可以在使用make_password功能时取回密码。

Django 安全 密码学

评论

1赞 deceze 7/9/2023
FWIW,我将创建一个自定义模型字段,该字段执行 en-/decryption 而不是信号。除此之外,由于服务器需要密钥来进行加密,因此存储密钥的位置并不是很重要。也许将它放在某个外部保险库中会比普通文件更安全一些;但一般来说,设法以某种方式闯入服务器的攻击者可能能够做你的服务器能做的一切。
1赞 JPG 7/9/2023
我认为可以使用这个pip包 - pypi.org/project/django-encrypted-model-fields

答:

0赞 sinkmanu 7/9/2023 #1

您的设计存在一个问题,即您需要一个主密码才能解密密码。你的问题不是微不足道的;在数据库中保存密码的建议是使用哈希,但该解决方案不适合您。

主密钥的另一个问题是它将在内存中,因此,执行内存转储的攻击者可以检索它并解密所有密码。因此,也许使用后的归零可能是一个解决方案。现在,使用更适合您情况的解决方案。编程不仅是一种方式......

在 Django 中,解决方案可以是,模型和视图中的 CharField 实现逻辑以加密/解密。或者使用您提到的pre_save脚本。但是关于你的问题是否足够安全,这取决于你正在处理的信息。