在模型

时间:2017-11-07 16:12:22

标签: python django

是否可以在Django模型中创建字段,其中包括:

1)在Django Form中,渲染我的模型我有一个字段(让它为" secret_key"),在那里我输入了一个人们不应该知道或看到的非常重要的密钥。

2)在我的Django模型中,该字段将被存储为密码字符串(例如,我输入12345,它将存储为* 9h ^%)

3)当我需要在我的网站中使用该字段时,我需要将Model(Model.secret_key)中的字段设为12345,而不是* 9h ^%

提前谢谢。

UPD:

我需要在没有"帮助"库。

2 个答案:

答案 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