是否可以在Django模型中创建字段,其中包括:
1)在Django Form中,渲染我的模型我有一个字段(让它为" secret_key"),在那里我输入了一个人们不应该知道或看到的非常重要的密钥。
2)在我的Django模型中,该字段将被存储为密码字符串(例如,我输入12345,它将存储为* 9h ^%)
3)当我需要在我的网站中使用该字段时,我需要将Model(Model.secret_key)中的字段设为12345,而不是* 9h ^%
提前谢谢。
UPD:
我需要在没有"帮助"库。
答案 0 :(得分:1)
虽然Withnail的答案很全面,但它提供了有关“单向”加密的信息,我认为您需要“双向”加密。
单向加密意味着将某些值 v1 存储为加密值 e1 ,这样您就可以从不确定 e1 的> v1 。但是,如果您显示新值 v2 ,则可以确定 v1 == v2 。
双向(对称)加密以加密形式 e1 存储某些值 v1 ,如果您知道用于加密它的密钥,则可以回溯。这不太安全,因为如果有人知道密钥,他们可以解码您的数据。但是,如果您的数据库列像这样加密,并将您的密钥存储在数据库之外,则攻击者无法仅使用数据库解码您的列。
有一个很棒的库已经被称为Django Fernet Fields,我认为这正是你想要的。它使用您的Django项目的SECRET_KEY加密和解密modelfields,同时让您在模板中定期使用它们。
答案 1 :(得分:0)
您正在寻找哈希。
django中哈希的主要实现是用户密码,你可以reuse the existing password hashers
使用非常简单且完全没有安全的示例。
SELECT
sd.Sales_Order,
sd.SO_Line,
sd.Material,
sd.Order_Qty,
COALESCE(ml.On_Hand_Qty,0) as On_Hand_Qty
FROM
SO_Detail sd
LEFT OUTER JOIN Material_Location ml ON sd.Material = ml.Material
ORDER BY
sd.Sales_Order,
sd.SO_Line
使用Django source code as an example,你可以覆盖你的保存方法/类似于在保存或检索时哈希你的字段。
import hashlib
a = hashlib.md5('This is just a test').hexdigest()
b = hashlib.md5('This is just a test').hexdigest()
a
Out[33]: 'df0a9498a65ca6e20dc58022267f339a'
b
Out[34]: 'a87edc4866a7e4257e5912ba9735d20e'
a == b
Out[35]: True
然后使用此功能here in the password/users model,
def make_password(password, salt=None, hasher='default'):
"""
Turn a plain-text password into a hash for database storage
Same as encode() but generate a new random salt. If password is None then
return a concatenation of UNUSABLE_PASSWORD_PREFIX and a random string,
which disallows logins. Additional random string reduces chances of gaining
access to staff or superuser accounts. See ticket #20079 for more info.
"""
if password is None:
return UNUSABLE_PASSWORD_PREFIX + get_random_string(UNUSABLE_PASSWORD_SUFFIX_LENGTH)
hasher = get_hasher(hasher)
if not salt:
salt = hasher.salt()
return hasher.encode(password, salt)
在这里检查密码时:
def set_password(self, raw_password):
self.password = make_password(raw_password)
self._password = raw_password