La génération d'un sel en PHP
Quelle est la meilleure façon de générer un point de vue cryptographique sécurisé 32 octets de sel en PHP, sans dépendre des bibliothèques rarement inclus dans PHP typique des installations?
Après quelques recherches sur google, j'ai découvert que mt_rand
n'est pas considéré comme assez sûr, mais je n'ai pas trouvé une suggestion pour un remplacement. Un article de suggestions de lecture à partir de /dev/random
mais pas seulement cela ne fonctionne pas sur windows; il est également très lent.
Je veux un équilibre raisonnable entre la sécurité et de la vitesse (c'est à dire, il ne devrait pas prendre 20 secondes pour générer de 512 octets, comme /dev/random
le fait habituellement)
/dev/urandom
peuvent être utilisés pour accélérer la génération, mais ne fonctionne toujours pas sur les systèmes Windows.OriginalL'auteur qster | 2010-03-25
Vous devez vous connecter pour publier un commentaire.
Vous voudrez peut-être jeter un oeil à la documentation (et les commentaires) pour
mcrypt_create_iv()
.OriginalL'auteur Amber
C'est plus facile en PHP 7:
Utilisez simplement
$sel = random_bytes($numberOfDesiredBytes);
pour générer un sel.De quoi avez-vous besoin d'un sel, de toute façon? Si c'est pour les mots de passe, il suffit d'utiliser
password_hash()
etpassword_verify()
.OriginalL'auteur Scott Arciszewski
Vous pouvez utiliser la fonction
mycrypt_create_iv()
, depuis la Version de PHP 5.3, il utilise également l'aléatoire de la source sur un serveur Windows (pas seulement sur Unix). Avant de l'utiliser, vous devez vérifier si la constanteMCRYPT_DEV_URANDOM
est défini.Contrairement aléatoire, urandom ne pas bloquer le serveur, si il n'y a pas assez d'entropie disponible. Puisque le mot de passe de ce nom doit être unique (pas nécessairement de façon aléatoire), urandom semble être un bon choix pour moi.
MCRYPT_DEV_URANDOM
est la valeur par défaut - si vous ne voulez pas le changer, vous pouvez tout aussi bien fairemcrypt_create_iv($length)
. De plus, cette fonctionnalité est implémentée dans lemcrypt
extension qui peut ou ne peut pas être installé sur votre serveur. Enfin, le résultat de cette fonction est une chaîne binaire qui n'est pas souvent que vous avez besoin, comme vous voulez enregistrer le sel pour le référencement plus tard. J'ai l'habitude debase64_encode
le résultat avant de l'utiliser comme un sel.Ce sont de bons points. De plus on doit vérifier, sous quelle forme le sel est prévu. BCrypt par exemple ne sera pas accepter un binaire de sel, mais un encodées en base64 le sel n'est pas valide non plus. Pour le hachage de mot de passe, il est préférable d'utiliser le construit en fonction de password_hash(), qui génère un coffre-fort de sel sur son propre.
Une raison de ne pas utiliser
password_hash()
est que je ne suis pas la mise en œuvre d'un mot de passe. J'ai besoin d'un sel de mettre en œuvre un apatride "api key" de style autorisation de protocole.En outre, password_hash() n'est pas disponible sur tous les serveurs. Mon serveur, par exemple, est collé sur php 5.3. password_hash() n'est pas disponible jusqu'à 5.5.
Cela ne devrait pas être un problème, il y a un compatibilité - > pack pour 5.3.7 et plus tard. Avec une mineure tweak il peut être utilisé même avec 5.3.
OriginalL'auteur martinstoeckli
uniqueid
n'est pas bien adapté pour générer une chaîne de caractères aléatoires, car il estmicrotime
base.Un Cycle du PROCESSEUR est généralement beaucoup plus courte que d'un microtime-tick, ce qui peut entraîner de la constance pour une variable donnée dans les boucles.
Le réglage de la deuxième paramètre de "l'entropie" à true,
permettra d'augmenter l'aléatoire.
Pour obtenir une chaîne de caractères aléatoires qui est bien compatible avec la plupart des caractères de jeux,on peut appliquer l'encodage base64 pour les mcrypt initilization fonction vecteur
mcrypt_create_iv
:Réduire le caractère de l'alphabet à 2^6Bit augmente la taille, qui est représenté ci-dessus.
OriginalL'auteur Lorenz Lo Sauer
Lire à partir de
/dev/urandom
, ou de l'utilisationopenssl_random_pseudo_bytes()
.OriginalL'auteur D.W.
uniqid() devrait être bon pour ce but.
OriginalL'auteur Crozin
Je pense que
microtime()
est assez.Étrange, mais je suis encore en train downvotes pour cette réponse.
Bien que la seule explication que je vois est que microtime est prévisible.
Il semble étrange pour moi, car le sel a toujours considéré comme ouvertement connu - donc, il n'y a pas d'utilisation à des fins de prédiction.
vous pouvez l'utiliser comme générateur de nombre aléatoire. Et obtenir un certain nombre d'octets que vous souhaitez. Et il n'est pas à l'heure actuelle, vous dégradée avec le temps(). Microsecondes faire changer assez vite. Et c'est seulement du sel, vous n'avez pas besoin de trop de sécurité sur le sel.
Exécuter
echo microtime()
par le biais d'une boucle for (10 boucles est très bien) et de voir comment mal vous êtes...Étrangement, mais certains commentaires peuvent contenir une contradiction, même dans une seule ligne: "c'est l'heure actuelle[cachet] mais je ne peux pas obtenir de 32 octets". J'ai toujours pensé que le timestamp unix est un nombre de 32 bits exactement.
les bits ne sont pas des octets.
OriginalL'auteur Your Common Sense