[ home ] [ a / jp / h / lain ] [ b / hum ] [ mu / tech / v / vis / x ] [ meta / nexo ]

/tech/ - Tecnología

No rompas las leyes de Isaac Asimov
Nombre
Email
Comentario
Archivo





[]
Adjuntar
Clave (Para eliminar el post.)

  • Archivos soportados: [ jpg, jpeg, png, gif ] , [ ogg, mp3 ] , [ webm ] & [ pdf ].
  • Adjuntos soportados: [ youtube, vimeo, dailymotion, metacafe & vocaroo ].
  • Tamaño máximo total 20MB.



File: mpv-shot0191.png (1.78 MB, 1516x1076) ImgOpsiqdb

1.78 MB

No.1862

Saludos, Wais, medio estoy aprendiendo PHP (literal después de ver POO, y un poco de MySQL, vi que hay una gran cantidad de cosas por aprender como PDO, y usar MVC pero de forma nativa ;_;). Entonces, revisando la documentación de PHP. Encontré este comentario.

>Since 2017, NIST recommends using a secret input when hashing memorized secrets such as passwords. By mixing in a secret input (commonly called a "pepper"), one prevents an attacker from brute-forcing the password hashes altogether, even if they have the hash and salt. For example, an SQL injection typically affects only the database, not files on disk, so a pepper stored in a config file would still be out of reach for the attacker. A pepper must be randomly generated once and can be the same for all users. Many password leaks could have been made completely useless if site owners had done this.


>Since there is no pepper parameter for password_hash (even though Argon2 has a "secret" parameter, PHP does not allow to set it), the correct way to mix in a pepper is to use hash_hmac(). The "add note" rules of php.net say I can't link external sites, so I can't back any of this up with a link to NIST, Wikipedia, posts from the security stackexchange site that explain the reasoning, or anything… You'll have to verify this manually. The code:


// config.conf
pepper=c1isvFdxMDdmjOlvxpecFw


<?php
// register.php
$pepper = getConfigVariable("pepper");
$pwd = $_POST['password'];
$pwd_peppered = hash_hmac("sha256", $pwd, $pepper);
$pwd_hashed = password_hash($pwd_peppered, PASSWORD_ARGON2ID);
add_user_to_database($username, $pwd_hashed);
?>

<?php
// login.php
$pepper = getConfigVariable("pepper");
$pwd = $_POST['password'];
$pwd_peppered = hash_hmac("sha256", $pwd, $pepper);
$pwd_hashed = get_pwd_from_db($username);
if (password_verify($pwd_peppered, $pwd_hashed)) {
echo "Password matches.";
}
else {
echo "Password incorrect.";
}
?>


Pregunto, si estoy haciendo una pequeña aplicación de prueba. Pero después la quiero desplegar en un ambiente de trabajo como si fuera real. Ese código puede servir para el sistema de login/registro sin ningún problema. ¿Sería completamente seguro? ¿Qué otra consideración debería tener?
>>

No.1867

>>

No.1868

No que quieres hacer, solo veo que estas hasheando dos veces la contraseña.
>>

No.1869

File: ff0.png (354.04 KB, 867x512) ImgOpsiqdb

354.04 KB
>>1867
Gracias por la respuesta Wai, aunque la verdad no me manejo mucho con el inglés :C
>>

No.1870

>>1867
Es que no manejo bien el tema, entonces me preguntaba si es más seguro utilizar este método, que el método estándar, donde sí se roban el hash, solo le hacen proceso contrario y obtienen la contraseña.
>>

No.1872

>>1870
Estoy casi seguro de que es imposible obtener la contraseña a partir del hash. Los métodos de hash siguen formulas matemáticas no reversibles o de una única dirección, como la derivada. Es como intentar recuperar la leche y los huevos de una tarta sabiendo la receta.
Esto es lo que yo siempre he escuchando, pero no estoy muy informado sobre ciberseguridad avanzada
>>

No.1873

>>

No.1874

>>1873
Vale bueno lo he leído. Entiendo lo que el fulano quiere hacer, tiene sentido y es correcto, pero no es lo normal, ya que bueno, lo normal es que desde un principio no tengan acceso a tu DB.
A no ser que trabajes para una gran empresa o manejes miles de cuentas de usuarios nadie va a gastar recursos en hacer tal ataque de fuerza bruta. Como mucho pasaran un diccionario para probar suerte y ya. Pero bueno sí, mejor prevenir…
>>

No.1875

>>1872
Vale, es como lo dices. Con cosas críticas si se tendrían que usar esas recomendaciones… igual soy alguien que está aprendiendo, tampoco sé mucho.

Para cosas más normales ya se puede usar los métodos comunes.
>>

No.1877

>>1875
El método común es un hash sha256 y listo. Pero si has aprendido esto y lo entiendes, utilizalo, yo lo utilizaré si alguna vez hago algo similar. En seguridad no se debe ser tacaño.
>>

No.1878

File: unnamed.gif (1.17 MB, 397x283) ImgOpsiqdb

1.17 MB
>>1862
Esta forma de encriptar la contraseña es mucho mas segura.
Si leíste lo que dice ese tipo, básicamente te explica que la forma real mas tangible de encontrar una contraseña a partir de una contraseña encriptada es básicamente adivinando.

Imagina que la contraseña es "Holaaaaaa" y la llave(a.k.a pepper) es "key".

Ahora imagina que el atacante consigue tu contraseña de la base de datos, esta se vería algo así:
$argon2id$v=19$m=16,t=2,p=1$NXFHcTd4ajRxcThQalBtTw$o5CkAOaV8xPXA7w82hhdxA

El atacante intentando adivinar llegaría a al siguiente resultado:
7dc283eafd76948589431e0d69eb358ef40da90b4af92e28840218d28c4a6ad

Entonces el atacante tendía que adivinar ese hash para llegar a:
Aquí iría la llave comparada con un padding usando xor92a3aba318bd961429870f08c637a3c697107420b54719d2be396ea11e3f46d6 (se vería algo como 3ef#ao692a3aba318bd961429870f08c637a3c697107420b54719d2be396ea11e3f46d6 )

Al cual tendría que quitarle la llave 'encriptada' con xor para adivinar el hash restante y llegar a:
Aquí iría la llave comparada con otro padding usando xorHolaaaaaa (se vería algo como f!g2d!13Holaaaaa)
Ya para finalmente quitarle la llave 'encriptada'.

Lo esencial sería poner una llave grande y complicada, lo cual haría mas complejo el proceso de adivinar.

A diferencia de solo hashear la contraseña que el atacante solo tendría que adivinar una vez el hash para llegar a la contraseña
>>

No.1879

>>1877
Hay que tener unas consideraciones. Por ejemplo, debes tener acceso al php.ini para usar este método. Aunque no sé si de esa forma es más seguro.

>>1878
Wai parece que tienes bastante manejo del tema. Entonces todo el proceso es así. Me imagino que tanto la contraseña común, como la pepper, deben ser largas como dices.

Aunque tengo otras dudas…
>>

No.1880

Tengo un pescado en mi bañera
>>

No.1916

>>1879
Ah si se me olvido mencionar que un atacante convencional solo intentaría adivinar el primer hash e intentaría hacer lo que dije anteriormente.
Pero si por alguna razón un atacante es mas astuto que el promedio intentando adivinar el primer hash y de alguna manera se da cuenta que tu contraseña esta encriptada de este modo.
Lo que él haría seria adivinar las dos contraseñas, la tuya y la del usuario y adivinar con que algoritmo hasheaste usando hmac, lo cual como puedes adivinar hacer toda esta tarea es prácticamente imposible.
>>

No.1918

La pimienta que mencionas es la llave para la contraseña.


$cipher_1 = hash_hmac("sha256", $mensaje, "iwakura-lain"); # b0d026d46f8253853556648f9a6f1d62701ed47329236a36be30f29780e8babe
$cipher_2 = password_hash($mensaje, PASSWORD_ARGON2ID); # $argon2id$v=19$m=65536,t=4,p=1$aVdaZkR5UWhOREh0U0FxTA$TKfqt+b5mvaPpC0mppMCsyXOu6HeRg3hJgOAcF2jbmY


Parece que la diferencia entre ambas funciones está en los sistemas de encriptación disponibles (password_hash no acepta SHA256) y cuestiones de compatibilidad entre distintas versiones de PHP.
Tendría que jugar un poco más.

Protip: Se puede usar PHP en modo servidor sin la necesidad de ngnix o apache2 y en cualquier directorio con el comando
php -S localhost:$puerto

Ejemplo
php -S localhost:8888

y luego por el navegador

localhost:8888/miArchivo.php


Si alguien sabe como usarlo con Burp agradecía cualquier tip, por alguna razón no lo toma.
>>

No.1920

File: Many-ElePHPants.jpg (112.37 KB, 480x360) ImgOpsiqdb

112.37 KB
>>1916
Eso suena muy bien

>>1918
¿Tienes algún web hosting para probar?

Vaya no conocía ese protip Wai, ¿es PHP por CLI? Voy a intentarlo


[Post a Reply]
[ ]
[ home ] [ a / jp / h / lain ] [ b / hum ] [ mu / tech / v / vis / x ] [ meta / nexo ]