Utilisation des fonctions de hashage

Un des cas d’usage les plus courants concerne la gestion des utilisateurs. Imaginons une application ouverte à tous, sauf concernant quelques actions pour lesquelles l’administrateur doit se connecter.

Il nous faut donc créer un fichier de configuration (ou utiliser une base de données) contenant le mot de passe de l’administrateur. Une bonne pratique consiste à ne pas stocker en clair ce mot de passe, mais à l’aide d’un hash (MD5, SHA…) ou d’une stratégie plus robuste. Si possible avec un salt, car dans le cas contraire, une personne qui récupérerait ce fichier de configuration pourrait retrouver certains mots de passe avec une attaque par table arc-en-ciel (http://fr.wikipedia.org/wiki/Rainbow_table).

Bien entendu, le hash est converti en base64 afin d’être stocké sous la forme d’une chaîne de caractères dans le fichier JSON. Ici, il s’agit de la chaîne « admin » (le résultat des fonctions de hash est du binaire).

{
	"port": ":7777",
	"password": "x61Ey612Kl2gpFL56FT9weDnpSo4AV8j8+qx2AuTHdRyY036xxzTTrw10Wq3+4qQyB+XURPWx1ONxp3Y3pB37A=="
}

Imaginons maintenant que l’on soit dans un programme qui reçoit la chaîne de caractère out et que l’on souhaite savoir si cette chaîne contient le bon mot de passe. Dans les lignes de code suivantes, nous allons effectuer la série d’actions suivantes :

  • Créer un objet de hash h.
  • Envoyer la chaîne de caractère out dans le flux géré par objet de hash h. Ce qui revient à hasher la chaîne à l’aide de l’algorithme SHA512. Attention au fait que le résultat est un format binaire, ce n’est pas une chaîne de caractères.
  • On encode ensuite le résultat (qui est un format binaire) en base64 de manière à pouvoir le comparer.
import "crypto/sha512"
…
	h := sha512.New()
	h.Write(out)
	str := base64.StdEncoding.EncodeToString(h.Sum([]byte{}))

	if str == config.Password {
		//Bon mot de passe
	} else {
		//Mauvais mot de passe
	}

Utiliser un salt

Comme je le disais en introduction, on peut relever un peu le niveau de sécurité en utilisant un salt. Le principe du salage (http://fr.wikipedia.org/wiki/Salage_(cryptographie) ) consiste à concaténer une chaîne de caractère (souvent aléatoire) au mot de passe. Voici un bout de code tout fait avec – dans la fonction main – un exemple de comparaison entre un bon et un mauvais mot de passe.

 

Aller plus loin avec bcrypt

Dans la plupart des entreprises, la stratégie de stockage Hash+Salt est considérée comme suffisante. Il est vrai que c’est déjà mieux que le stockage en clair. Cependant, il existe d’autres stratégies de stockage plus sûres. Dans un prochain article, nous étudierons le fonctionnement de bcrypt.


Étiquettes :   hash 
Portrait de Benjamin BALET
Benjamin BALET
Consultant APM

Retrouvez mes cooordonées

Benjamin BALET sur viadeo






Vous aimerez aussi

Les lois de la réflexion

Une traduction du blog officiel de golang expliquant le mécanisme de la réflexion en Go.   Lire »

Gobs le format natif d'échange de données en Go

Traduction d'un article du blog officiel expliquant comment échanger des données entre deux programmes golang grâce à un format natif   Lire »

Comment gérer efficacement les erreurs en golang ?

Préconisations officielles pour la gestion des erreurs dans un programme golang. Cet article complète les explications sur panic, defer et recover   Lire »

Contrôle d'exécution avec for, if, else et switch

Article expliquant comment ajouter de la logique dans son programme Go avec les instructions golang de contrôle, de boucle et d'évaluation de type.   Lire »

Exemple de chiffrement asymétrique avec RSA et golang

Cryptage de toute ou partie des données avec un algorithme à clé publique/privée.   Lire »

Commentaires

Soyez le premier à commenter cet article

Publier un commentaires

Tous les commentaires sont soumis à modération. Les balises HTML sont pour la plupart autorisées. Les liens contextuels et intéressants sont en follow.

(requis)
(requis)
(requis, mais non publié)
(recommandé si vous souhaitez être publié)