2017-04-23 2 views
0

私の場合は電子メールで値に署名しなければならず、署名された値をDjango CharField。 私はdjango.core.signingモジュールのSigner.signメソッドを使用しています。 dbフィールドのmax_lengthパラメータも挿入したいので、私はmax_lengthに入れることができる最小値を常にdbに格納するために問題になります。Signerオブジェクト(django.core.signing)のsignメソッドの出力を格納するDjango CharFieldの最小max_length

答えて

0

これはDjango docsに記載されています。

from django.core.signing import Signer 
>>> signer = Signer() 
>>> value = signer.sign('My string') 
>>> value 
'My string:GdMGD6HNQ_qdgxYP8yBZAdAIV1w' 

符号文字列が(「:」を含む)28の長さであるプラス私はあなたがDjangoのTextField代わりのCharFieldです

+1

'max_length'には制限がありません。唯一の制限は、MySQLインデックスの最大長が767バイトであることです。つまり、キャラクターごとに3バイトを使用する文字セットを持つCharFieldでインデックスまたはユニーク制約を使用する場合、_then_は255です異なるデータベースを使用する場合やインデックスを使用しない場合は、最大長に制限はありません(ただし、行のサイズなど)。 – knbk

+0

訂正していただきありがとうございます。 – badiya

1

を使用することをお勧めメールstring.toの長さは安全側に実際に署名トークン長さは、入力された値で成長する:

>>> from django.core.signing import Signer 
>>> signer = Signer() 
>>> signer.sign('a') 
'a:JRYbTbX2xBKZAgJxbzUzsl80vIQ' 

>>> signer.sign('ab') 
'ab:ThbCyQ9bQpAX4vMAmYSEtbtF7Y4' 

>>> signer.sign('abc') 
'abc:4_rTdYDe18bPklTTKYIsJaB9_oM' 

>>> signer.sign('abcd') 
'abcd:RzGFLsNgRv-LQ4lEorvNPjGH5LM' 

>>> signer.sign('abcde') 
'abcde:oOdfJjZ14Jz2F4aHD3pQMBC9fAA' 

>>> signer.sign('abcdefghijkl') 
'abcdefghijkl:Wz1gPy4QS7ZoCyXuKgUFG-ofxpU' 

しかし、私のテストによれば、トークンの最大サイズは27あります。この回答によるとWhat is the maximum length of a valid email address?電子メールアドレスの最大長は254文字です。 max_lengthの属性が282254 + 27 +セパレータの場合は)である必要があります。

+1

署名はHMACとSHA-1をハッシュ関数として使用し、base64で出力を符号化し、base64出力からパディング文字 '= 'を取り除きます。 SHA-1の出力は20バイト、base64は長さを33%増加させるので、テストで見つかった最大27バイトが正しいです。 – knbk

関連する問題