Corrigiendo el problema de bits altos en la implementación crypt () de PHP

3

Estoy trabajando en un sitio que debe ser compatible con versiones anteriores de PHP, que sufren de un bit alto problema en la implementación de Blowfish crypt() . Esencialmente, los caracteres que no son ASCII no se procesan correctamente, y es posible que un atacante reduzca el espacio de fuerza bruta. Hay una solución en 5.3.7, pero tendré que admitir versiones anteriores.

Para solucionar el problema, estoy pensando en Base64 que codifica la contraseña antes de ejecutarla a través de crypt() . La idea es que base64_encode() es seguro binario, y la salida nunca contendrá ningún carácter cuyo bit más significativo esté establecido.

¿Es esta una suposición segura, o debería buscar un método alternativo?

    
pregunta Polynomial 05.02.2013 - 17:17
fuente

2 respuestas

3

La salida Base64 está limitada a dígitos ASCII, letras (minúsculas y mayúsculas), '+', '/', '=' y terminaciones de nueva línea (CR y LF). Todos estos encajan en los 7 bits más bajos.

El uso de la codificación Base64 tiene el desafortunado efecto secundario de ampliar los datos en aproximadamente un 33%. Dado que bcrypt tiene un límite de tamaño de 55 caracteres, por lo tanto, con la codificación Base64 está en aproximadamente 39 bytes.

Además, los caracteres de contraseña no ASCII abren el turbio negocio de las páginas de códigos (Unicode, UTF-8, Windows-1252 ...) y Base64 no resuelve que ; simplemente empuja el problema debajo de la alfombra.

    
respondido por el Thomas Pornin 05.02.2013 - 17:31
fuente
2

Solo usa effectivePass = Base64Encode(Sha256(Utf8Encode(password)))) . Se encarga de la codificación y el límite de longitud. Luego ponga effectivePass en bcrypt.

Creo que para php treats, las cadenas son bytes en bruto, por lo que es probable que necesites establecer algún encabezado http de codificación de caracteres en UTF-8 en lugar de codificación.

    
respondido por el CodesInChaos 05.02.2013 - 18:16
fuente

Lea otras preguntas en las etiquetas