Lorsque vous travaillez sur une application de site Web, moi et un ami avons demandé à un expert en sécurité (qui travaille chez IBM) comment gérer le stockage des mots de passe. Après des heures de recherches sur Google (entraînant des heures d'exploration de security.stackexchange.com), j'ai déterminé que le fait d'avoir une base de données utilisateur avec le sel dans la base de données est sécurisé, tant qu'il s'agit d'un sel par utilisateur et d'un algorithme de hachage lent.
L'expert en sécurité a déclaré que si la base de données était compromise, tout était compromis, ce qui est vrai. Il a suggéré "un cryptage à sens unique", ce que ... je ne comprends pas vraiment. Le hachage n'est-il pas, par définition, à sens unique, alors que le chiffrement, par définition, ne l'est pas?
Si quelqu'un pouvait éclaircir ce point, ce serait formidable.
Vous avez raison. Le hachage n'est pas inversible et le cryptage l'est. L'expert en sécurité parle à travers son chapeau.
Le "poivre" dont parle cpast est la clé d'un hachage à clé. Dans ce cas, l'entrée de l'algorithme de hachage comprend trois composants: le mot de passe, le sel et la clé. Si la base de données est compromise, le sel est compromis, mais la clé ne l'est pas. Si la clé est de longueur non triviale, comme 128 bits, la récupération du mot de passe uniquement à partir du hachage et du sel n'est probablement pas possible. (Strictement parlant, c'est un problème "insoluble". On sait comment s'y prendre - essayez toutes les valeurs clés possibles - on ne peut tout simplement pas le faire dans un délai raisonnable.)
Je suppose que le terme "cryptage unidirectionnel" remonte à l'époque où aucune fonction de hachage cryptographique n'était disponible, donc pour obtenir un hachage de mot de passe sur les systèmes Unix par exemple, une fonction de cryptage a été utilisée ( DES ). Cependant, au lieu de fournir une clé fixe pour chiffrer le mot de passe (utilisation normale de cet algorithme mais qui permettrait de déchiffrer le mot de passe en utilisant cette même clé), le mot de passe lui-même a été utilisé à la fois comme clé et comme données à chiffrer.
De cette façon, un cryptage à sens unique a été réalisé car il n'y avait aucun moyen de décrypter le mot de passe sans le savoir déjà.
Ensuite, le temps a passé, beaucoup de gens, dont des mathématiciens hautement qualifiés et des ingénieurs de sécurité de haut niveau, ont travaillé sur le sujet et nous ont fourni de meilleurs outils pour chaque besoin (ici: fonctions de hachage de mot de passe). De nos jours, personne ne devrait donc essayer de bricoler les algorithmes existants pour les utiliser de manière inappropriée (un cryptage est utilisé pour crypter du texte, et non pour produire un hachage).
Dans le langage technique habituel, le "cryptage unidirectionnel" signifie le hachage. Bien que le hachage techniquement soit une opération distincte du chiffrement, ce sont tous les deux des "primitives cryptographiques" et il est courant (bien que techniquement incorrect) de désigner toute la cryptographie comme chiffrement. Être pédant avec votre collègue sur ce point est peu susceptible de vous gagner des amis. Lorsque je parle à des personnes qui ne sont pas des spécialistes de la sécurité, j'utilise généralement l'expression "cryptage unidirectionnel", car elle est plus largement comprise.
En aparté, il est possible de transformer n'importe quelle opération de hachage de bloc en un chiffrement symétrique, et tout chiffrement symétrique en une opération de hachage de bloc. Il y a quelques informations sur Wikipedia et Bruce Schneier en discute plus en détail dans son livre "Cryptographie Appliquée".