Il bcrypt ha una lunghezza massima della password?

71

Oggi stavo scherzando con bcrypt e ho notato qualcosa:

hashpw('testtdsdddddddddddddddddddddddddddddddddddddddddddddddsddddddddddddddddd', salt)
Output: '$2a$15$jQYbLa5m0PIo7eZ6MGCzr.BC17WEAHyTHiwv8oLvyYcg3guP5Zc1y'

hashpw('testtdsdddddddddddddddddddddddddddddddddddddddddddddddsdddddddddddddddddd', salt)
Output: '$2a$15$jQYbLa5m0PIo7eZ6MGCzr.BC17WEAHyTHiwv8oLvyYcg3guP5Zc1y'

Il bcrypt ha una lunghezza massima della password?

    
posta d0ctor 31.07.2013 - 15:19
fonte

3 risposte

61

Sì, bcrypt ha una lunghezza massima della password. L' articolo originale contiene questo:

the key argument is a secret encryption key, which can be a user-chosen password of up to 56 bytes (including a terminating zero byte when the key is an ASCII string).

Quindi è possibile dedurre una lunghezza massima della password di input di 55 caratteri (senza contare lo zero finale). Caratteri ASCII, attenzione: un generico carattere Unicode, quando codificato in UTF-8, può usare fino a quattro byte; e il concetto visivo di un glifo può consistere in un numero illimitato di caratteri Unicode. Risparmierai un sacco di preoccupazioni se limiti le tue password ad ASCII semplice.

Tuttavia, vi è una notevole quantità di confusione sul limite effettivo. Alcune persone credono che il limite "56 byte" includa un valore di 4 byte, portando a un limite inferiore di 51 caratteri. Altre persone sottolineano che l'algoritmo, internamente, gestisce le cose come 18 parole a 32 bit, per un totale di 72 byte, quindi è possibile andare a 71 caratteri (o anche 72 se non si gestiscono stringhe con uno zero finale).

Le implementazioni effettive avranno un limite che dipende da ciò che l'implementatore ha creduto e fatto valere in tutte le precedenti. Tutte le implementazioni decenti ti consentiranno almeno 50 caratteri. Oltre a ciò, il supporto non è garantito. Se è necessario supportare password più lunghe di 50 caratteri, è possibile aggiungere un passaggio di hashing preliminare, come discusso in questa domanda (ma, ovviamente, questo significa che non si calcola più" il "bcrypt, ma una variante locale, quindi l'interoperabilità va a scapito) .

Modifica: mi è stato fatto notare che sebbene, dal punto di vista di un crittografo, l' articolo sia il riferimento finale, non è necessariamente il modo in cui i designer Ci ho pensato. L'implementazione "originale" può elaborare fino a 72 byte. A seconda della tua posizione sul formalismo, puoi affermare che l'implementazione è giusta e l'articolo è sbagliato. Ad ogni modo, tale è lo stato attuale delle cose che il mio consiglio rimane valido: se mantieni meno di 50 caratteri, starai bene ovunque. (Naturalmente sarebbe stato meglio se l'algoritmo non avesse una limitazione di lunghezza in primo luogo.)

    
risposta data 31.07.2013 - 15:34
fonte
15

Sì, BCrypt ha un limite superiore di 72 caratteri. È una limitazione dello stesso codice Blowfish. Un modo per ovviare a questo problema è usando SHA-256 prima e poi BCrypt il risultato. Nel tuo caso sarebbe qualcosa di simile

hashpw(sha256('pass'), salt)
    
risposta data 31.07.2013 - 15:35
fonte
6

tl; lr: BCrypt è limitato a 72 byte, non 56.

Sfondo

BCrypt è limitato a 72 byte. Il documento originale menziona anche l'uso di un terminatore null. Ciò significa che in genere ti limiti a:

  • 71 caratteri + 1 byte null terminator

Ma la revisione di BCrypt 2a specifica l'uso della codifica UTF-8 (mentre il white paper originale si riferisce ad ASCII). Quando si utilizza UTF-8, un carattere non significa un byte, ad esempio:

  • Noël è di quattro caratteri, ma cinque byte ( N o e ¨ l )
risposta data 19.04.2018 - 20:07
fonte

Leggi altre domande sui tag