w3schools password_hash password example encrypt desencriptar decrypt crypt_sha512 php passwords blowfish crypt password-hash

password_hash - php encrypt decrypt



Cripta para el hashing de contraseñas. Blowfish produce salida extraña (1)

La razón por la que estás viendo problemas es que en realidad no usa 22 caracteres de sal. Solo utiliza 21.25 caracteres. Entonces, algunos bits del 22do carácter se usan para la sal, y los restantes se usan para el hash (el resultado).

La razón es que la sal no es una cuerda. Es un número de 128 bits. El número se serializa en base64. Para revisar cómo funciona la base 64, cada bloque de 3 bytes se "traduce" en un bloque de 4 bytes.

[byte1][byte2][byte3] [new1][new2][new3][new4]

Ahora, recuerde que cada byte original tiene 8 bits. Por lo tanto, cada "nuevo byte" solo tendrá 6 bits (porque no estamos agregando información, solo la estamos representando de manera diferente).

Entonces, lo que está sucediendo es que solo estás proporcionando 21 caracteres de datos. Lo que se traduce a 15.75 bytes cuando se decodifica. Pero no puedes tener un byte parcial. Por lo tanto, el último bloque descodificado se desecha (debido a que no tiene información suficiente). Y esos 6 bits que tiramos se mapean completamente al personaje 21.

Por lo tanto, sin los 2 bits que se utilizan a partir del 22 ° carácter, el 21 ° debe desecharse (porque los bytes parciales no tienen sentido).

Podemos probar esto:

$chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ./"; for ($i = 0; $i < strlen($chars); $i++) { echo crypt(''string that should be hashed'', ''$2y$08$12345678901234567890'' . $chars[$i]) . "/n"; }

Produce:

$2y$08$123456789012345678900.iIlIFEGaqDj6XbnKkK1F14HmMGLV.mu $2y$08$123456789012345678901.iIlIFEGaqDj6XbnKkK1F14HmMGLV.mu $2y$08$123456789012345678902.iIlIFEGaqDj6XbnKkK1F14HmMGLV.mu . . . $2y$08$12345678901234567890/.iIlIFEGaqDj6XbnKkK1F14HmMGLV.mu

Pero si añadimos un byte 22 (independientemente de lo que sea):

$chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ./"; for ($i = 0; $i < strlen($chars); $i++) { echo crypt(''string that should be hashed'', ''$2y$08$12345678901234567890'' . $chars[$i] . ''a'') . "/n"; }

Entonces obtenemos el efecto de la distribución aleatoria:

$2y$08$123456789012345678900OtUUu.EAOjrOztGKf2m.TZIe7HGzFgF. $2y$08$123456789012345678901Ou28wcnld1gB2vjW9obdQdz6kLMasqKC $2y$08$123456789012345678902Oum7Yp/p4TEeEC5JxsmnQsACNnnK0cv2 $2y$08$123456789012345678903OxMer1AD.P.UpAMlykl5SokMmDM1BU0W $2y$08$123456789012345678904OpoNDsh7DaAoSjiZFJKO7iMy53BqwsjO $2y$08$123456789012345678905OQRUqlnlEpBzccxrCgyZVtl6a.tQxNz6 $2y$08$123456789012345678906O6QMFdYZ.tvQpSdYaxlFl1Rlsk05/Aym $2y$08$123456789012345678907OwF1TKI.OYT3xtBxg8tqex4L8mZttUCm $2y$08$123456789012345678908OtzJXaS8/x0KYQ2epPRgVSjWSy/yAwMK $2y$08$123456789012345678909O17D/xQeJGLIzpwBZuN2kxdpxi6p3aDq $2y$08$12345678901234567890aOQs9arCVhxFtQ.Z7yJUOtp8UCDsR1rHa $2y$08$12345678901234567890bOD9Z5cUlQgJtvhqSOIK/3BV/1QIEmHby $2y$08$12345678901234567890cOG5DxIU4B/ftl01V/MhViyi8YymLKEdC $2y$08$12345678901234567890dOcd0.C8PVpjqW7oGI9AZuTVjNwxZDDpa $2y$08$12345678901234567890eOLQSg5zmHm2nOCmRMdNeY8LxW1xMKnwm $2y$08$12345678901234567890fOI.DZa4KuxngvaBT8JFtRWY8oRs9A266 $2y$08$12345678901234567890gOTA9XsdwxujLBdLaypPHehWjj1GyjDRC $2y$08$12345678901234567890hOkS/cZmSqtdHSWz3zPkImTfZbHvdC8Wm $2y$08$12345678901234567890iOXDaVzn/h7/oQtUgHyPodyggGkOqxFdW $2y$08$12345678901234567890jODbaT2pRSwnD2qHm43YdAbHVPBJ8iapi $2y$08$12345678901234567890kOrUyng3J5OCChkP6tHiM.rz4o4CdPkTO $2y$08$12345678901234567890lOtscWm7fnlUJXZIXLKhVI7E2Abh7uc3i $2y$08$12345678901234567890mOCeJM40E/G0WrJ4utkSaJwtZUMCae326 $2y$08$12345678901234567890nO4ac8AzrsXk6HpAtOaGEvGfS8eceFtSC $2y$08$12345678901234567890oOv3BFJmdPMx9josbfOHHtu/7xgoGUygq $2y$08$12345678901234567890pOPWQlIGa.WBx8kDEEG05uWhUioyNqWiq $2y$08$12345678901234567890qOg2ufL5bmYfAoZEFknsRaSOlI4GVBKWy $2y$08$12345678901234567890rOJZTvmghag6zIY5Ha7iOCgArPZGotche $2y$08$12345678901234567890sOZjZ2OaVZy.GeXp/BQvjbCpXgNa/GAlK $2y$08$12345678901234567890tO3bAZAMEXEZm72/mAkbJkefUua9CUFuy $2y$08$12345678901234567890uOQ.i2vydj6OGyl84Qhg5OXPq7OkRQomu $2y$08$12345678901234567890vOc9BKZfLu6mcd2mIfLtmT6C6JwDT.Siq $2y$08$12345678901234567890wO7ow2JgV.7yzEsllHUbhbMrOMKXSihsq $2y$08$12345678901234567890xOUI89zc5eDCCCHoTljMyXuGXmIz9b0PW $2y$08$12345678901234567890yORmKbjoeO.1HSpQB7L5EBMSRjJr4lR62 $2y$08$12345678901234567890zOZkhGY/cILtgQRmHLkx//nuzLXSwLqYy $2y$08$12345678901234567890AOuJWX5/tdzRCTTs5EXYioLP1t7u1Ao7u $2y$08$12345678901234567890BO2vHWuKdbL2lsbBQwaAkWCXz/YVEaHP2 $2y$08$12345678901234567890COedKIdK.eAjm2zF0CAnuM9XxbO3CakoK $2y$08$12345678901234567890DOpunwAyx9X4/tJzDmUXARABluQdRV7Ji $2y$08$12345678901234567890EOB1ONHz9lELb7iUvtzTi.PTSgN2tFv1. $2y$08$12345678901234567890FOplAZBguPKXbAQDxq9PXqgjH/1ZX6u7C $2y$08$12345678901234567890GOP/G3kfN/r92DIQlC0eVyGi3jWRUoVXK $2y$08$12345678901234567890HOmala7V1QCL7PX79yODRg2Y5lTq6i/ii $2y$08$12345678901234567890IOWbq1AXhTucizWIBn58rgVYFpRxMpm8. $2y$08$12345678901234567890JOxgmM1XAcDg7AUpzeHzHxn6z75ljNoDy $2y$08$12345678901234567890KOTnfd7pzmfzf80CrXxWC24sK3y1DAbb6 $2y$08$12345678901234567890LOXxQX37TiNlNMfZUtMLZFrZah8u39q9K $2y$08$12345678901234567890MOmpvWu3ZKbbilLb4f8QF6OUPPpEbsM42 $2y$08$12345678901234567890NO8VjZ2KNbOVoOzgP/Tjd6IFtwjRG2PJ2 $2y$08$12345678901234567890OOvSnZoahC5g1Ewlm6K7US13i6vJIQSqm $2y$08$12345678901234567890POVs5m/8eCyLd11zjEPYoYhpaZAz6PYF2 $2y$08$12345678901234567890QOk4MBZhDwzS8dwJl6lm.hdAVBcllSid2 $2y$08$12345678901234567890ROWh4H3TuKSuFfrtx1vqHnU/RrQ0HrbNW $2y$08$12345678901234567890SOd/USMzVBx6wyPgsuvAszCIVZ6zOA44O $2y$08$12345678901234567890TO53YobspFDSFshtGX9hH4LTw2OT2T4P. $2y$08$12345678901234567890UOMLp7HSCxWMMxgJVN6JTN7WRKlRPN17y $2y$08$12345678901234567890VOmOMGgpLXOV/mft8WXOWXmQjc71SN6g2 $2y$08$12345678901234567890WOiAkYTQmitOHabdScoZivJ4JeKtJ6t7. $2y$08$12345678901234567890XOUUqRtGjd/nob.UiRrJvFyKSMELAIuZe $2y$08$12345678901234567890YOukccL1Y2PDV9ErOLHileZOq5m6zIzSy $2y$08$12345678901234567890ZOMNrfK..n1YjuP3F.S4Taxn0XvIf5gXW $2y$08$12345678901234567890.OmG2XbJMpLDBrtq44ptVtXkVaGdAT9oO $2y$08$12345678901234567890/OTN4hG/XcY.FtrT85TGI.Vm0sH0tpQ.a

Ahora, para demostrar que solo estamos usando unos pocos bits del último byte, variemos ese, manteniendo fijo el 21:

$chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ./"; for ($i = 0; $i < strlen($chars); $i++) { echo crypt(''string that should be hashed'', ''$2y$08$12345678901234567890a'' . $chars[$i]) . "/n"; }

Aquí está:

$2y$08$12345678901234567890auYqXTg7.1WNKn8Yxc4wW2p2ppsJb9rZa $2y$08$12345678901234567890auYqXTg7.1WNKn8Yxc4wW2p2ppsJb9rZa $2y$08$12345678901234567890auYqXTg7.1WNKn8Yxc4wW2p2ppsJb9rZa $2y$08$12345678901234567890auYqXTg7.1WNKn8Yxc4wW2p2ppsJb9rZa $2y$08$12345678901234567890auYqXTg7.1WNKn8Yxc4wW2p2ppsJb9rZa $2y$08$12345678901234567890auYqXTg7.1WNKn8Yxc4wW2p2ppsJb9rZa $2y$08$12345678901234567890auYqXTg7.1WNKn8Yxc4wW2p2ppsJb9rZa $2y$08$12345678901234567890auYqXTg7.1WNKn8Yxc4wW2p2ppsJb9rZa $2y$08$12345678901234567890auYqXTg7.1WNKn8Yxc4wW2p2ppsJb9rZa $2y$08$12345678901234567890auYqXTg7.1WNKn8Yxc4wW2p2ppsJb9rZa $2y$08$12345678901234567890aOQs9arCVhxFtQ.Z7yJUOtp8UCDsR1rHa $2y$08$12345678901234567890aOQs9arCVhxFtQ.Z7yJUOtp8UCDsR1rHa $2y$08$12345678901234567890aOQs9arCVhxFtQ.Z7yJUOtp8UCDsR1rHa $2y$08$12345678901234567890aOQs9arCVhxFtQ.Z7yJUOtp8UCDsR1rHa $2y$08$12345678901234567890aeDDHXF42QK8mY.t4/x9I.DNpdmARsDG. $2y$08$12345678901234567890aeDDHXF42QK8mY.t4/x9I.DNpdmARsDG. $2y$08$12345678901234567890aeDDHXF42QK8mY.t4/x9I.DNpdmARsDG. $2y$08$12345678901234567890aeDDHXF42QK8mY.t4/x9I.DNpdmARsDG. $2y$08$12345678901234567890aeDDHXF42QK8mY.t4/x9I.DNpdmARsDG. $2y$08$12345678901234567890aeDDHXF42QK8mY.t4/x9I.DNpdmARsDG. $2y$08$12345678901234567890aeDDHXF42QK8mY.t4/x9I.DNpdmARsDG. $2y$08$12345678901234567890aeDDHXF42QK8mY.t4/x9I.DNpdmARsDG. $2y$08$12345678901234567890aeDDHXF42QK8mY.t4/x9I.DNpdmARsDG. $2y$08$12345678901234567890aeDDHXF42QK8mY.t4/x9I.DNpdmARsDG. $2y$08$12345678901234567890aeDDHXF42QK8mY.t4/x9I.DNpdmARsDG. $2y$08$12345678901234567890aeDDHXF42QK8mY.t4/x9I.DNpdmARsDG. $2y$08$12345678901234567890aeDDHXF42QK8mY.t4/x9I.DNpdmARsDG. $2y$08$12345678901234567890aeDDHXF42QK8mY.t4/x9I.DNpdmARsDG. $2y$08$12345678901234567890aeDDHXF42QK8mY.t4/x9I.DNpdmARsDG. $2y$08$12345678901234567890aeDDHXF42QK8mY.t4/x9I.DNpdmARsDG. $2y$08$12345678901234567890auYqXTg7.1WNKn8Yxc4wW2p2ppsJb9rZa $2y$08$12345678901234567890auYqXTg7.1WNKn8Yxc4wW2p2ppsJb9rZa $2y$08$12345678901234567890auYqXTg7.1WNKn8Yxc4wW2p2ppsJb9rZa $2y$08$12345678901234567890auYqXTg7.1WNKn8Yxc4wW2p2ppsJb9rZa $2y$08$12345678901234567890auYqXTg7.1WNKn8Yxc4wW2p2ppsJb9rZa $2y$08$12345678901234567890auYqXTg7.1WNKn8Yxc4wW2p2ppsJb9rZa $2y$08$12345678901234567890a.FpXM0OnHV1fSxeBCiU8eEDae5LtBtAO $2y$08$12345678901234567890a.FpXM0OnHV1fSxeBCiU8eEDae5LtBtAO $2y$08$12345678901234567890a.FpXM0OnHV1fSxeBCiU8eEDae5LtBtAO $2y$08$12345678901234567890a.FpXM0OnHV1fSxeBCiU8eEDae5LtBtAO $2y$08$12345678901234567890a.FpXM0OnHV1fSxeBCiU8eEDae5LtBtAO $2y$08$12345678901234567890a.FpXM0OnHV1fSxeBCiU8eEDae5LtBtAO $2y$08$12345678901234567890a.FpXM0OnHV1fSxeBCiU8eEDae5LtBtAO $2y$08$12345678901234567890a.FpXM0OnHV1fSxeBCiU8eEDae5LtBtAO $2y$08$12345678901234567890a.FpXM0OnHV1fSxeBCiU8eEDae5LtBtAO $2y$08$12345678901234567890a.FpXM0OnHV1fSxeBCiU8eEDae5LtBtAO $2y$08$12345678901234567890a.FpXM0OnHV1fSxeBCiU8eEDae5LtBtAO $2y$08$12345678901234567890a.FpXM0OnHV1fSxeBCiU8eEDae5LtBtAO $2y$08$12345678901234567890a.FpXM0OnHV1fSxeBCiU8eEDae5LtBtAO $2y$08$12345678901234567890a.FpXM0OnHV1fSxeBCiU8eEDae5LtBtAO $2y$08$12345678901234567890aOQs9arCVhxFtQ.Z7yJUOtp8UCDsR1rHa $2y$08$12345678901234567890aOQs9arCVhxFtQ.Z7yJUOtp8UCDsR1rHa $2y$08$12345678901234567890aOQs9arCVhxFtQ.Z7yJUOtp8UCDsR1rHa $2y$08$12345678901234567890aOQs9arCVhxFtQ.Z7yJUOtp8UCDsR1rHa $2y$08$12345678901234567890aOQs9arCVhxFtQ.Z7yJUOtp8UCDsR1rHa $2y$08$12345678901234567890aOQs9arCVhxFtQ.Z7yJUOtp8UCDsR1rHa $2y$08$12345678901234567890aOQs9arCVhxFtQ.Z7yJUOtp8UCDsR1rHa $2y$08$12345678901234567890aOQs9arCVhxFtQ.Z7yJUOtp8UCDsR1rHa $2y$08$12345678901234567890aOQs9arCVhxFtQ.Z7yJUOtp8UCDsR1rHa $2y$08$12345678901234567890aOQs9arCVhxFtQ.Z7yJUOtp8UCDsR1rHa $2y$08$12345678901234567890aOQs9arCVhxFtQ.Z7yJUOtp8UCDsR1rHa $2y$08$12345678901234567890aOQs9arCVhxFtQ.Z7yJUOtp8UCDsR1rHa $2y$08$12345678901234567890a.FpXM0OnHV1fSxeBCiU8eEDae5LtBtAO $2y$08$12345678901234567890a.FpXM0OnHV1fSxeBCiU8eEDae5LtBtAO

¿Te das cuenta de que solo se producen 4 hashes únicos? Esto se debe a que solo estamos utilizando los primeros 2 bits (2 ^ 2) de ese último byte. El resto es en realidad parte del hash del resultado (y, por lo tanto, se tira).

¿Tener sentido?

Y BTW: por esta y otras razones, sugeriría no usar crypt() directamente, sino usar una biblioteca. Como la password que viene en PHP 5.5, o su biblioteca de compatibilidad (que mantengo) password_compat .

Estoy teniendo algunos problemas para entender la función de cripta de php. Mi versión de PHP es 5.4.7.

Quiero usar crypt para almacenar contraseñas saladas en la base de datos, porque, según me han dicho, los desarrolladores que usan md5 para hacer hash de las contraseñas deben ser replanteados y grabados en el momento.

Quería utilizar el alg de pez globo para generar el hash. Ahora, de acuerdo con la documentación de php, crypt usa blowfish si lo llama con "$ 2y $" + costo (por ejemplo: "08") + "$" + 22 caracteres salt (./0-9A-Za-z) . Sin embargo, la salida de este pequeño código de prueba me confunde:

echo "<pre>"; if (CRYPT_BLOWFISH == 1) { echo ''Blowfish SaltLen = 18: '' . crypt(''string that should be hashed'', ''$2y$08$123456789012345678'') . "/n"; echo ''Blowfish SaltLen = 19: '' . crypt(''string that should be hashed'', ''$2y$08$1234567890123456789'') . "/n"; echo ''Blowfish SaltLen = 20: '' . crypt(''string that should be hashed'', ''$2y$08$12345678901234567890'') . "/n"; echo ''Blowfish SaltLen = 21: '' . crypt(''string that should be hashed'', ''$2y$08$123456789012345678901'') . "/n"; echo ''Blowfish SaltLen = 22: '' . crypt(''string that should be hashed'', ''$2y$08$1234567890123456789012'') . "/n"; } echo "</pre>";

Salida:

Blowfish SaltLen = 18: $2y$08$123456789012345678$$$.Gq4WBozZb6XYmOJ88OC8gThSTUx8pRO Blowfish SaltLen = 19: $2y$08$1234567890123456789$$.u8Qm7Q9KVtvo2zwpKkN5ntAxu71k2pO Blowfish SaltLen = 20: $2y$08$12345678901234567890$.iIlIFEGaqDj6XbnKkK1F14HmMGLV.mu Blowfish SaltLen = 21: $2y$08$123456789012345678901.iIlIFEGaqDj6XbnKkK1F14HmMGLV.mu Blowfish SaltLen = 22: $2y$08$123456789012345678901uSFz9yPi/jA6e9aMcUkm7y.TJYhcCoSu

La cripta aparentemente llena la sal con $ si no es lo suficientemente larga. La sal cambia y también lo hace el hachís. Así que la salida en la línea 1 y 2 es la esperada.

Sin embargo, lo que me desconcierta son los últimos tres hash: al parecer, el punto separa el hash de la sal (?), Pero si realmente le asignas a la cripta los 22 caracteres que exige como sal, el punto desaparece. Además, el último carácter de la sal no aparece en la salida, pero cambia el hash en comparación con la sal de 21 caracteres.

¡Lo que es especialmente confuso es la línea 3 y 4 en la salida! La sal es obviamente diferente, pero los hashes son exactamente iguales. Simplemente no puedo ver ninguna consistencia en esto y agradecería enormemente la ayuda.