Risolve il problema di high-bit nell'implementazione di crypt () di PHP

3

Sto lavorando su un sito che deve avere compatibilità con le versioni precedenti di PHP, che soffrono di un high-bit problema nell'implementazione di Blowfish crypt() . In sostanza, i caratteri non ASCII non vengono elaborati correttamente e potrebbe essere possibile per un utente malintenzionato ridurre lo spazio brute-force. C'è una correzione in 5.3.7, ma dovrò supportare le versioni precedenti.

Per risolvere il problema, sto pensando a Base64 che codifica la password prima di eseguirla tramite crypt() . L'idea è che base64_encode() è binario sicuro e l'output non conterrà mai alcun carattere il cui bit più significativo è impostato.

Questa è un'ipotesi sicura, o dovrei considerare un metodo alternativo?

    
posta Polynomial 05.02.2013 - 17:17
fonte

2 risposte

3

L'output Base64 è limitato a cifre ASCII, lettere (minuscole e maiuscole), '+', '/', '=' e terminazioni newline (CR e LF). Tutti questi si inseriscono nei 7 bit più bassi.

L'uso della codifica Base64 ha lo sfortunato effetto collaterale di ingrandire i dati di circa il + 33%. Poiché bcrypt ha un limite di dimensione di 55 caratteri, quindi con la codifica Base64 sei a circa 39 byte.

Inoltre, i caratteri di password non ASCII aprono l'oscura attività delle code page (Unicode, UTF-8, Windows-1252 ...) e Base64 non risolve quello ; semplicemente spinge il problema sotto il tappeto.

    
risposta data 05.02.2013 - 17:31
fonte
2

Usa solo effectivePass = Base64Encode(Sha256(Utf8Encode(password)))) . Si prende cura della codifica e del limite di lunghezza. Quindi metti effectivePass in bcrypt.

Credo che le trame di php siano stringhe non elaborate, quindi probabilmente dovrai impostare un http-header con codifica in HTML su UTF-8 invece di codificare.

    
risposta data 05.02.2013 - 18:16
fonte

Leggi altre domande sui tag