Comment générer un bon de sel Est ma fonction assez sécurisé?
Voici la fonction que j'utilise pour générer des sels:
function generateRandomString($nbLetters){
$randString="";
$charUniverse="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
for($i=0; $i<$nbLetters; $i++){
$randInt=rand(0,61);
$randChar=$charUniverse[$randInt];
$randString=$randomString.$randChar;
}
return $randomString;
}
C'est pour un non site web commercial. Il est seulement utilisé pour générer le sel (pour être stockée dans la base de données et l'utiliser avec l'utilisateur soumis pw pour le hachage).
Est-il approprié? Dois-je utiliser un plus grand sous-ensemble de caractères, et si oui, est-il un moyen facile de le faire en PHP?
Vous devez vous connecter pour publier un commentaire.
Si vous êtes le hachage des mots de passe, vous devez utiliser un moderne algorithme de hachage qui ne vous obligent pas à générer votre propre sel. À l'aide de la faiblesse des algorithmes de hachage présente un danger pour vous et vos utilisateurs. Ma réponse a été écrit il y a huit ans. Les temps ont changé, et le hachage de mot de passe est beaucoup plus facile maintenant.
Vous devriez toujours l'utilisation intégrée des fonctions de hachage/vérifier les mots de passe. À l'aide de vos propres algorithmes à tout point introduit une énorme quantité de risque inutile.
Pour PHP, utilisez password_hash(), avec la
PASSWORD_BCRYPT
algorithme. Il n'est pas nécessaire de fournir votre propre sel.Ci-dessous est ma réponse originale à cette question, pour la postérité:
De la php sha1 page:
Cela semble plus simple et plus efficace (puisque chacun est unique) que ce que vous avez proposé.
Si vous êtes sur Linux,
/dev/urandom
est probablement votre meilleure source de l'aléatoire. Il est fourni par le système d'exploitation lui-même, c'est donc la garantie d'être beaucoup plus fiable que n'importe quelle fonction PHP.Cela vous donnera 32 octets de hasard blob. Vous aurez probablement envie de passer ce à travers quelque chose comme
base64_encode()
pour le rendre lisible. Pas besoin de jongler avec les caractères de vous-même.Édition 2014: En PHP 5.3 et au-dessus,
openssl_random_pseudo_bytes()
est le moyen le plus facile pour obtenir un tas d'octets aléatoires. Sur les systèmes *nix, il utilise/dev/urandom
derrière les coulisses. Sur les systèmes Windows, il utilise un algorithme différent qui est intégré dans la bibliothèque OpenSSL.Connexes: https://security.stackexchange.com/questions/26206
Connexes: dois-je utiliser urandom ou openssl_random_pseudo_bytes?
mysql_real_escape_string()
.password_hash()
est disponible dans PHP 5.5 et versions plus récentes. Je suis surpris d'apprendre qu'il n'est pas mentionné ici.Avec password_hash() il n'est pas nécessaire de générer un sel, car le sel est automatiquement généré à l'aide de la bcrypt algorithme -- et, par conséquent, pas besoin de faire un ensemble de caractères.
Au lieu de cela, soumis par l'utilisateur, le mot de passe est par rapport à l'unique hachage de mot de passe stocké dans la base de données à l'aide de password_verify(). Enregistrer nom d'utilisateur et le hachage de Mot de passe de l'utilisateur table de base de données, vous serez en mesure de le comparer à un soumis par l'utilisateur mot de passe à l'aide de password_verify().
Comment hachage de mot de passe () ing travaux:
La password_hash() fonction génère un mot de passe unique de hachage, lors du stockage de la chaîne de caractères dans une base de données, il est recommandé que la colonne permet d'avoir jusqu'à 255 caractères.
Pour vérifier un mot de passe haché, vous utilisez
password_verify()
:Si vous préférez, le sel peut être ajouté manuellement comme une option, comme suit:
$salt = password_hash("goat", PASSWORD_DEFAULT);
Réponse mis à jour.Remplacer
rand(0,61)
avecla fonction mt_rand(0, 61)
et vous devriez être bien (Depuismt_rand
est mieux à produire des nombres aléatoires)...Mais plus important que la force du sel est la façon dont vous hachage elle. Si vous avez un grand sel de routine, mais seulement de faire
md5($pass.$salt)
, vous êtes de jeter le sel. Personnellement, je recommande l'étirement de la table de hachage... Par exemple:Pour plus d'informations sur le hachage de l'étirement, découvrez cette SORTE de réponse...
Je voudrais prendre conseil auprès d'une autre réponse et l'utilisation la fonction mt_rand(0, 61), parce que le nombre de Mersenne Twister produit de meilleurs entropie.
En outre, votre fonction est vraiment deux parties: la génération aléatoire d'
$nbLetters
chiffres et l'encodage dans base62. Cela rendra les choses beaucoup plus clair pour un entretien programmeur (peut-être vous!) qui bute sur quelques années en bas de la route:C'est ma méthode, Il utilise des nombres vraiment aléatoires de bruit atmosphérique. Il est tout mélangé avec des pseudo-aléatoire des valeurs et des cordes. Mélangées et haché. Voici mon code: j'appelle ça de l'overkill.
Le bruit atmosphérique est fourni par random.org. J'ai également vu vraiment de génération aléatoire à partir d'images de lampes lava qui sont interprétés par la teinte et l'emplacement. (La teinte est l'emplacement)
Ici est une bien meilleure façon, si vous avez windows et ne peux pas faire de /dev/random.
Je pense qu'un très bon sel, par exemple, est le nom d'utilisateur (si vous parlez d'pw hachage et le nom d'utilisateur ne change pas.)
Vous n'avez pas besoin de générer quoi que ce soit et n'avez pas besoin de stocker plus de données.
Une technique assez simple:
Contrairement à uniqid (), il génère un résultat aléatoire.
J'utilise ceci:
Si vous voulez ultime unique sel, vous devez utiliser une unique valeur entrée et requis par l'utilisateur, telles que le courrier électronique ou le nom d'utilisateur, puis de hachage en utilisant sha1 puis fusionnez - concaténer avec le sel de la valeur générée par votre code.
Un autre, vous devez prolonger
$charUniverse
par le moyen de certains caractères spéciaux tels que@,!#-
etc.