Python Django字符域的最小最大长度,用于存储签名者对象(Django.core.signing)的sign方法的输出
我必须签署一个值,在我的电子邮件中,我必须将签署的值存储在Django CharField中。 我正在使用django.core.signing模块的Signer.sign方法。Python Django字符域的最小最大长度,用于存储签名者对象(Django.core.signing)的sign方法的输出,python,django,sign,maxlength,Python,Django,Sign,Maxlength,我必须签署一个值,在我的电子邮件中,我必须将签署的值存储在Django CharField中。 我正在使用django.core.signing模块的Signer.sign方法。 由于我还想为db字段插入max_length参数,我的问题是,为了始终成功地将其存储在db中,我可以在max_length中输入的最小值是多少。这是他们在 签名字符串的长度为28(包括“:”)加上电子邮件字符串的长度。为了安全起见,我建议您使用Django而不是CharField。事实上,签名令牌的长度随着输入值的增加
由于我还想为db字段插入max_length参数,我的问题是,为了始终成功地将其存储在db中,我可以在max_length中输入的最小值是多少。这是他们在
签名字符串的长度为28(包括“:”)加上电子邮件字符串的长度。为了安全起见,我建议您使用Django而不是CharField。事实上,签名令牌的长度随着输入值的增加而增加: 来自django.core.signing导入签名者的
>>
>>>签名者=签名者()
>>>签名者。签名('a'))
'a:JRYbTbX2xBKZAgJxbzUzsl80vIQ'
>>>签名者。签名('ab')
'ab:THBCYQ9BQPAX4VMAMYESBTF7Y4'
>>>签名者。签名('abc')
“abc:4_rTdYDe18bPklTTKYIsJaB9_oM”
>>>签名者。签名('abcd')
‘abcd:RzGFLsNgRv-LQ4lEorvNPjGH5LM’
>>>签名者。签名('abcde')
'abcde:oOdfJjZ14Jz2F4aHD3pQMBC9fAA'
>>>signer.sign('abcdefghijkl')
‘abcdefghijkl:WZ1GPy4QS7ZOCYXUKGKUFG of XPU’
但是,根据我的测试,令牌的最大大小是
27
。根据此答案,电子邮件地址的最大长度为254个字符<您的文本字段的code>max_length
属性应为282
(254
+27
+1
用于分隔符)。对max_length
没有限制。唯一的限制是MySQL索引的最大长度为767字节,这意味着如果对CharField
使用索引或唯一约束,且字符集每个字符使用3字节,则限制为255。当使用不同的数据库或无索引时,最大长度没有限制(但可能有其他限制,例如行的大小)。签名使用HMAC和SHA-1作为其哈希函数,然后在base64中编码输出,从base64输出中去除任何填充字符=
。SHA-1的输出是20个字节,base64将长度增加了33%,因此您在测试中发现的最大27个字节是正确的。
from django.core.signing import Signer
>>> signer = Signer()
>>> value = signer.sign('My string')
>>> value
'My string:GdMGD6HNQ_qdgxYP8yBZAdAIV1w'