【问题标题】:urandom in django model / mySQL Database [duplicate]django模型/ mySQL数据库中的urandom [重复]
【发布时间】:2019-02-01 10:49:58
【问题描述】:

我正在尝试将 urandom 值存储到我的 Django 项目的 mySQL 数据库中。出于加密目的,该值必须是完全随机的。

我尝试了几个小时,我真的很沮丧。我搜索了一些答案,但解决方案不起作用。

如果我按照这里的建议尝试这个Store os.urandom variable to Sqlite database in Django

def createkey():
    random_bytes = urandom(16)
    return b64encode(random_bytes)

key = models.BinaryField(max_length=16, default=createkey)

...我收到此错误消息

django.db.utils.OperationalError: (1067, "Invalid default value for 'key'")

我也尝试过使用 binascii 库 os.urandom() decoding Issue 像这样

def createkey():
    return binascii.hexlify(urandom(16)).decode()

有了上面的内容,我得到了这个错误信息:

string argument without an encoding

我正在使用 Python 3.6、Django 1.11.5 和 MySQL 数据库。

有没有办法将 urandom 的值存储到 Django 模型中?我想将它存储在 CharField 中,但如果它可以与其他字段一起使用,我也很高兴。

【问题讨论】:

    标签: python mysql django cryptography


    【解决方案1】:

    我会尝试做这样的事情:

    _key = models.BinaryField(blank=True)
    

    删除max_length=16,因为它与urandom(16) 不匹配... urandom 参数对应于最大字节数。

    然后,在Model...上调用的 createkey 方法中,您希望保存一个值到数据库,而不仅仅是返回一个值。仅当在 Modal 实例上调用时才能访问返回值......例如,Modal.createkey()

    所以,你会想要更多类似的东西:

    def createkey():
        self._key = binascii.hexlify(urandom(16)).decode()
    

    并在视图级别调用您的 createkey() 方法。

    这应该可以解决您的invalid default value for key 错误。

    如果没有实际复制你所拥有的,我有点怀疑你甚至可以做到以下几点:

    def createkey():
        random_bytes = urandom(16)
        return b64encode(random_bytes)
    
    key = models.BinaryField(blank=True, default=self.createkey)
    

    您甚至可以通过CharField 侥幸逃脱:

    key = models.CharField(max_length = x)
    

    上面的x 是 BLOCK_SIZE * 2 来保存十六进制数据,或 4 * ( BLOCK_SIZE / 3) 来保存 base64 数据。对于您的具体示例,BLOCK_SIZE 为 16。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-04
      • 1970-01-01
      • 2017-12-21
      • 2021-04-06
      • 2011-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多