web-dev-qa-db-fra.com

Quelle est la meilleure façon de créer un hachage / une chaîne aléatoire?

Quelle est la meilleure façon de générer un hachage dans le but de stocker une session? Je recherche une solution légère et portable.

44
Eric Gates

Vous pouvez utiliser les fonctions de hachage intégrées de PHP, sha1 et md5 . Choisissez-en un, pas les deux.

On peut penser qu'en utilisant les deux, sha1(md5($pass)) serait une solution. L'utilisation des deux ne sécurise pas votre mot de passe, entraîne des données redondantes et n'a pas beaucoup de sens.

Jetez un oeil à Consortium de sécurité PHP: hachage de mot de passe ils donnent un bon article avec des faiblesses et améliorent la sécurité avec le hachage.

Nonce signifie "numbres utilisées une fois ". Elles sont utilisées sur les demandes pour empêcher tout accès non autorisé, elles envoient une clé secret et vérifient la chaque fois que votre code est utilisé.

Vous pouvez en savoir plus sur ( Bibliothèque PHP NONCE de FullThrottle Development

10
Anthony Forloney
bin2hex(mcrypt_create_iv(22, MCRYPT_DEV_URANDOM));
  1. mcrypt_create_iv vous donnera une séquence aléatoire d'octets.
  2. bin2hex le convertira en ASCII text

Exemple de sortie:

d2c63a605ae27c13e43e26fe2c97a36c4556846dd3ef

Gardez à l'esprit que "meilleur" est un terme relatif. Vous avez un compromis à faire entre sécurité, unicité et rapidité. L'exemple ci-dessus est bon pour 99% des cas, mais si vous traitez avec des données particulièrement sensibles, vous voudrez peut-être en savoir plus sur la différence entre MCRYPT_DEV_URANDOM et MCRYPT_DEV_RANDOM .

Enfin, il existe un RandomLib "pour générer des nombres aléatoires et des chaînes de différentes forces".

Notez que jusqu'à présent, j'ai supposé que vous cherchez à générer une chaîne aléatoire , qui n'est pas la même chose que dériver un hachage à partir d'une valeur. Pour ce dernier, reportez-vous à password_hash .

65
Gajus

random_bytes() est disponible à partir de PHP 7.0 (ou utilisez ce polyfill pour 5.2 à 5.6 ):

$hash = bin2hex(random_bytes(16));
echo serialize($hash);

Sortie:

s: 32: "c8b2ca837488ff779753f374545b603c";

19
0b10011

Peut-être que uniqid () est ce dont vous avez besoin?

niqid - Générer un ID unique

9
z-boss

Vous pouvez utiliser openssl_random_pseudo_bytes depuis php 5.3.0 pour générer une chaîne pseudo aléatoire d'octets. Vous pouvez utiliser cette fonction et la convertir en quelque sorte en chaîne en utilisant l'une de ces méthodes:

$bytes = openssl_random_pseudo_bytes(32);
$hash = base64_encode($bytes);

ou

$bytes = openssl_random_pseudo_bytes(32);
$hash = bin2hex($bytes);

Le premier générera la chaîne la plus courte, avec des chiffres, des minuscules, des majuscules et quelques caractères spéciaux (=, +, /). La deuxième alternative générera des nombres hexadécimaux (0-9, a-f)

7
Simon Backx

Utilisez random_bytes() s'il est disponible!

$length = 32;

if (function_exists("random_bytes")) {
    $bytes = random_bytes(ceil($lenght / 2));
    $token = substr(bin2hex($bytes), 0, $lenght)
}

Vérifiez-le sur php.net

1
Zoltán Süle

J'utilise personnellement Apache's mod_unique_id pour générer un numéro unique aléatoire pour stocker mes sessions. C'est vraiment facile à utiliser (si vous utilisez Apache).

Pour les nonce, jetez un œil ici http://en.wikipedia.org/wiki/Cryptographic_nonce il y a même un lien vers une bibliothèque PHP PHP.

0
t00ny

Je ne gère généralement pas les identifiants de session manuellement. J'ai vu quelque chose dans ce sens recommandé pour mélanger les choses un peu avant, je ne me suis jamais utilisé, donc je ne peux pas attester qu'il est meilleur ou pire que celui par défaut (notez que c'est pour une utilisation avec autogen et non avec une gestion manuelle).

//md5 "emulation" using sha1
ini_set('session.hash_function', 1);
ini_set('session.hash_bits_per_character', 5);
0
prodigitalson