Python/Django,解密在shell中工作,但在测试期间不工作

2024-09-30 18:22:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在研究的项目使用Fernet进行加密,我们需要存储访问令牌。出于某种原因,在shell中运行代码时,解密工作正常,但测试失败,因为访问令牌没有被解密。你知道吗

第一个问题

在Django shell中运行代码和通过测试运行代码之间有区别吗?这可以解释我的烦恼。你知道吗

第二个问题

如果在Django shell中运行代码和在测试期间运行代码没有区别,那么问题就来自其他地方。请继续阅读并检查下面的代码以使事情更清楚。你知道吗

在shell和从数据库加载同一对象的测试中,让我们调用这个对象facebookToken。当我跑的时候facebookToken.decryptedAccessToken它工作得很好。但是,运行测试时相同的代码不起作用,decryptedAccessToken返回加密值!你知道吗

处理加密的类

class Gatekeeper(object):
"""A simple class to encrypt en decrypt strings."""

key = settings.FERNET_KEY

def encrypt(self, secret):
    """Return an encrypted string.

    attribute secret: a string to encrypt
    """
    fernet = Fernet(self.key)
    # cast string to bytes
    secret = secret.encode()
    encryptedSecret = fernet.encrypt(secret)
    return encryptedSecret

def decrypt(self, secret):
    """Return a decrypted string.

    attribute secret: a secret string to decrypt
    """

    print '\n \n secret', secret
    fernet = Fernet(self.key)
    # cast string to bytes
    secret = secret.encode()
    print '\n \n ENCODED secret', secret
    decryptedSecret = fernet.decrypt(secret)
    print '\n \n decryptedSecret', decryptedSecret
    return decryptedSecret

自定义加密文本字段类。

class EncryptedTextField(models.TextField):
"""A custom textfield for storing sensitive information."""

description = "A textfield for storing sensitive information."

def __init__(self, *args, **kwargs):
    super(EncryptedTextField, self).__init__(*args, **kwargs)

def get_db_prep_value(self, value, connection, prepared=False):
    """Return encrypted value or None.

    This method encryps the value before storing it in the database.
    """
    if value is not None:
        value = Gatekeeper().encrypt(value)

    return value

抽象AccessToken类

class AccessToken(models.Model):
"""Abstract class for Access tokens.

Depends on Gatekeerp, EncryptedTextField, and User class in core app!
"""
owner = models.ForeignKey('core.User')
socialMediaChannel = models.IntegerField(
    choices=socialMediaChannelList, null=False, blank=False
)
accessToken = EncryptedTextField(null=False, blank=False)
accessTokenSecret = EncryptedTextField(null=True, blank=True)
lastUpdate = models.DateTimeField(auto_now=True)

class Meta:
    abstract = True

@classmethod
def getAccessTokens(cls, user, socialMediaChannel):
    """Return a list with AccessToken objects. Filter on user and
    socialMediaChannel.

    attribute user: a user object
    attribute socialMediaChannel: a socialMediaChannel
    """

    accessTokens = cls.objects.filter(
        owner=user,
        socialMediaChannel=socialMediaChannel
    )

    return accessTokens

@property
def decryptedAccessToken(self):
    """Return decrypted accessToken."""
    return Gatekeeper().decrypt(self.accessToken)

@property
def decryptedAccessTokenSecret(self):
    """Return decrypted accessTokenSecret."""
    return Gatekeeper().decrypt(self.accessTokenSecret)

Tags: to代码selfsecretstringreturnvaluemodels