这是一个旧的,但要走的路是在存储密码之前对其进行加密。使用安全存储的密钥(即不在数据库中(或至少不在同一个数据库中)并且不在 Github 中)并将其加载到部署项目的环境中。这样,任何直接访问数据库的人都无法读取密码。
更多信息的可能来源
Cryptography 库是一个很好用的库,在上面的文章中有引用。
对于这个问题中描述的情况,我会在环境中放置一个加密密钥并将其加载到settings.py
部署中,它看起来像这样:
生成密钥
from cryptography.fernet import Fernet
key = Fernet.generate_key()
如果库已安装到您的 Python 环境中,您可以在 Python 控制台中运行上述内容。
根据您部署应用程序的方式,您需要提供对其密钥的访问权限。以下是将其引入您的环境的一种方法:
export ENCRYPTION_KEY="<key>"
一旦你在你的环境中的设置中添加了这一行
ENCRYPTION_KEY=os.get("ENCRYPTION_KEY")
如何使用密钥?根据您的设置,您可以在模型上编写其他属性方法来获取和设置字段的值,例如
class mymodel(models.Model):
....
@property
def password(self):
f = Fernet(settings.ENCRYPTION_KEY)
password = f.decrypt(self.<myfield>)
return password
@password.setter
def password(self, password):
f = Fernet(settings.ENCRYPTION_KEY)
token = f.encrypt(<password>)
self.<myfield> = token
self.save()
其他选项可能是子类化另一个 django 模型字段并在那里添加功能。如果你只在一个地方这样做,那么上面应该没问题。
如何存储加密密钥取决于您,环境只是一种选择。这里的关键是将它保存在安全的地方,重要的是不要丢失它......或者祝你好运;)