Valeurs de hachage et de salage

Je développe une petite application Web qui authentifie en interne les utilisateurs. Une fois l’utilisateur authentifié, mon application Web transmet ensuite certaines informations, telles que l’ID utilisateur et le nom de la personne, à une application Web tierce. Le développeur tiers suggère de hacher et de saler les valeurs.

Pardonnez mon ignorance, mais qu’est-ce que cela signifie exactement?

J’écris l’application en Java. Donc, ce que je prévois de faire, c’est de hacher l’ID utilisateur, le nom de la personne et une valeur Math.random () comme sel avec Apache Commons Digest Utils SHA512 et de transmettre cette chaîne hachée avec l’ID utilisateur et le nom de la personne.

Est-ce la pratique habituelle? Je devrais passer la troisième partie le sel aussi bien correct?

Un sel est normalement utilisé pour stocker les hachages de mots de passe en toute sécurité. Le hachage d’un mot de passe pour le stockage ou la communication (de sorte qu’il ne peut pas être lu par d’autres) est vulnérable au décodage à l’aide de tables arc-en-ciel . Désormais, lorsque vous ajoutez une chaîne aléatoire au mot de passe, mais que vous la stockez avec le hachage, cela devient beaucoup plus difficile. Le calcul de ce nouveau hash ressemble à ceci:

hash(password + salt) 

ou même

 hash(hash(password) + salt) 

Pour vous connecter en toute sécurité à un site Web tiers, vous pouvez envoyer l’ID utilisateur, le hachage salé (ci-dessus) et le sel que vous avez utilisé (s’il n’est pas indiqué). Selon la façon dont ce site Web a stocké ses mots de passe, vous pouvez générer le sel pour vous-même ou vous pouvez demander un sel.

Une option consiste à envoyer d’abord le nom d’utilisateur au site Web, puis à le laisser répondre avec le sel, puis à renvoyer le hash(password+salt)) au site Web.

En Java, vous pouvez faire quelque chose comme:

 import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.lang.RandomSsortingngUtils; /** * SHA1-hash the password with the user's salt. * * @param password */ public void setPassword(Ssortingng password) { if (password.equals(this.password)) { return; } if (passwordSalt == null || passwordSalt.equals("")) { passwordSalt = RandomSsortingngUtils.randomAscii(20); } this.password = DigestUtils.shaHex(password + passwordSalt); } /** * Check if a given password is correct. * * @param givenPassword * @return True is correct, else false. */ public boolean checkPassword(Ssortingng givenPassword) { return (password.equals(DigestUtils.shaHex(givenPassword + passwordSalt))); } 

Ensuite, le mot de passe n’est pas lisible, même si un pirate informatique vole votre firebase database.

Juste un avertissement, il y a de la désinformation sur ce qu’il faut faire avec le sel. Il est normal et normal de stocker le sel. Chaque mot de passe doit avoir son propre sel qui est stocké en texte brut avec lui. Il est censé rendre beaucoup plus difficile la tâche de la déchiffrer à l’aide d’une table de hachage pré-calculée pour une personne ayant déjà volé votre firebase database de mots de passe hachée.

Pour ce qui est d’envoyer le sel à la troisième partie, il me faudrait un peu plus d’informations. Quiconque utilise le mot de passe fourni par le client lors de l’authentification, le hache et le compare à la version pré-hachée a besoin du sel afin que le mot de passe fourni par le client pour l’authentification puisse être haché exactement de la même manière qu’auparavant.

Une fois l’utilisateur authentifié, mon application Web transmet ensuite certaines informations, telles que l’ID utilisateur et le nom de la personne, à une application Web tierce. Le développeur tiers suggère de hacher et de saler les valeurs.

Cela ne semble pas juste. Les hachages sont des opérations à sens unique. Vous ne pouvez pas prendre le résultat d’un hachage et en deviner le texte clair

Ce que je prévois de faire est le hachage de l’ID utilisateur, du nom de la personne et de la valeur Math.random () comme sel.

Pour tout texte en clair, vous devez utiliser le même sel, sinon le hachage résultant sera différent. Donc, si vous utilisez un sel aléatoire ou généré, vous devez le stocker avec le hachage du mot de passe.

Utiliser le SHA-256 ou le SHA-512, c’est bien et c’est ce que recommande le NIST

Je verrais si vous ne pouvez pas trouver plus d’informations ou quelques exemples de cette application tierce avec laquelle vous travaillez. Ce que vous décrivez ne semble pas être une pratique courante et, en toute honnêteté, cela n’a même pas de sens d’être fondé sur ce que vous avez dit.

Vous authentifiez l’utilisateur dans votre programme (plusieurs réponses semblent résoudre ce problème, et oui, vous devriez stocker les mots de passe de vos utilisateurs sous forme de hachages salés, mais c’est un tout autre problème) et ensuite, en les authentifiant, transmettez certaines informations. à cette application tierce. Maintenant, cela dépend de ce que cette application est censée faire / savoir exactement. Par exemple, s’il doit connaître l’ID utilisateur, vous ne pouvez pas le hacher / saler avant de le soumettre, car l’application ne pourra jamais récupérer l’ID utilisateur d’origine. D’un autre côté, si l’application a simplement besoin d’un identifiant pour reconnaître les demandes et que le hachage ID utilisateur + nom d’utilisateur est simplement une suggestion , alors cela a du sens, vous générez une chaîne unique mais non décodable pour l’utilisateur. application tierce à utiliser, essentiellement comme clé de session.

Si cette deuxième voie est ce qu’ils essaient de vous faire faire, c’est une façon un peu étrange (et pas très sûre) de traiter les demandes, mais cela me semble bien aller.

Donc, comme je l’ai dit, voyez si vous pouvez trouver quelques exemples ou même si vous souhaitez poster plus d’informations à propos de l’application en question ici, et nous pourrons jeter un coup d’oeil nous-mêmes.

L’intérêt d’un sel est de rendre les attaques utilisant ce qu’on appelle des “tables arc-en-ciel” irréalisables (d’un sharepoint vue probabiliste: si vous prenez un hachage suffisamment grand, il devient effectivement impossible de pré-calculer les tables arc-en-ciel).

http://en.wikipedia.org/wiki/Rainbow_table

Au lieu de simplement faire un hachage ( a ) et de stocker le hachage:

 :460526e74fd6a25b525e642db2f756a4: 

vous faites du hash (a + salt) et vous stockez le hash et le sel (le sel peut être pris au hasard):

 :cdd5bc3f05f6a76f6c82af728b2c555c:346884e6e35be: