Usando Hash, Sha, tokens...

  • Autor Autor xcodex
  • Fecha de inicio Fecha de inicio
X

xcodex

Que tal!!, les cuento, estuve trabajando en un script para prevenir ataques CSRF. Nada del otro mundo, que compruebe un token almacenado en $_SESSION y lo compare con un campo hidden del formulario.
Mi pregunta es que tan recomendado ser generar el token de la siguiente manera:
PHP:
    session_start();
    session_regenerate_id();
    $session_id = session_id();
    $hora = date ("d-m-Y");
    $token1 = hash('sha256',$hora.$session_id.mt_rand(0,9999).mt_rand(0,9999).mt_rand(0,9999).mt_rand(0,9999));
    $token2 = hash('sha256',$token1);
    $_SESSION['token'] = $token2;

Y en el formulario:
PHP:
<input type="hidden" name="code" value="<?php echo $_SESSION["token"]; ?>">


Si quieren ignoren los mt_rand jajajaja :sonrisaabierta:

¿Es sha256 el más recomendado?
 
No esta mal, aunque no es necesario que uses hash(), por ejemplo en uno de mis proyectos hago esto:

PHP 7
PHP:
$_SESSION['token'] = bin2hex(random_bytes(32));

o +PHP 5.4 (ext-mcrypt)
PHP:
$_SESSION['token'] = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM));

y para comparar los tokens uso hash_equals()
 
No esta mal, aunque no es necesario que uses hash(), por ejemplo en uno de mis proyectos hago esto:

PHP 7
PHP:
$_SESSION['token'] = bin2hex(random_bytes(32));

o +PHP 5.4 (ext-mcrypt)
PHP:
$_SESSION['token'] = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM));

y para comparar los tokens uso hash_equals()

¡¡Gracias por tu respuesta!!, ¿será mas seguro que un hash?, no digo que esté mal ni nada, es solo curiosidad jaja, lo pregunto porque siempre veo puros tutoriales en los que hacen los login con hash.

- - - Actualizado - - -

La compliqué un poco mas y lo dejé así:
PHP:
session_start();
    session_regenerate_id();
    $bin = bin2hex(random_bytes(32));
    $sid = hash('sha256', $session_id = session_id());
    $hora = hash('sha256', date ("d-m-Y"));
    $_SESSION['token'] = $bin.$sid.$hora;
 
¡¡Gracias por tu respuesta!!, ¿será mas seguro que un hash?, no digo que esté mal ni nada, es solo curiosidad jaja, lo pregunto porque siempre veo puros tutoriales en los que hacen los login con hash.

- - - Actualizado - - -

La compliqué un poco mas y lo dejé así:
PHP:
session_start();
    session_regenerate_id();
    $bin = bin2hex(random_bytes(32));
    $sid = hash('sha256', $session_id = session_id());
    $hora = hash('sha256', date ("d-m-Y"));
    $_SESSION['token'] = $bin.$sid.$hora;

Tomando en cuenta que es para protegerse de ataques csrf o similares no le veo el problema. Y para hash también puedes usar los algoritmos sha384 o sha512.
 
laravel ya trae todo eso, y cuando intentas enviar datos por post no deja amenos que pases el token, osea ya eso viene definido en laravel es muy bueno pruebalo
 
Atrás
Arriba