Je vois beaucoup de confusion entre les algorithmes de hachage et de chiffrement et j'aimerais avoir davantage de conseils d'experts sur:
Quand utiliser les hashes vs les cryptages
Ce qui différencie un algorithme de hachage ou de chiffrement (d’un niveau théorique/mathématique), c’est-à-dire ce qui rend les hachages irréversibles (sans l’aide d’un arbre arc-en-ciel)
Voici quelques similaires SO questions qui n'entrent pas dans les détails que je cherchais:
Quelle est la différence entre obfuscation, hachage et chiffrement?
Différence entre cryptage et hachage
Eh bien, vous pouvez le rechercher dans Wikipedia ... Mais puisque vous voulez une explication, je ferai de mon mieux ici:
Ils fournissent un mappage entre une entrée de longueur arbitraire et une sortie (généralement) de longueur fixe (ou de longueur inférieure). Cela peut aller d'un simple crc32 à une fonction de hachage cryptographique complète telle que MD5 ou SHA1/2/256/512. Le fait est qu’il existe une cartographie à sens unique. C’est toujours un: 1 mappage (ce qui signifie qu’il y aura toujours des collisions) car chaque fonction produit un résultat plus petit que ce qu’elle est capable de saisir (si vous introduisez tous les fichiers possibles de 1 Mo dans MD5, vous aurez une tonne de collisions).
La raison pour laquelle ils sont difficiles (ou impossibles dans la pratique) à inverser est due à leur fonctionnement interne. La plupart des fonctions de hachage cryptographiques parcourent le jeu d'entrées plusieurs fois pour produire le résultat. Donc, si nous examinons chaque bloc d’entrée de longueur fixe (qui dépend de l’algorithme), la fonction de hachage l’appellera à l’état actuel. Il va ensuite parcourir l'état et le changer en un nouvel état et l'utiliser comme retour en lui-même (MD5 le fait 64 fois pour chaque bloc de données de 512 bits). Il combine ensuite en quelque sorte les états résultants de toutes ces itérations pour former le hachage résultant.
Maintenant, si vous voulez décoder le hachage, vous devez d’abord comprendre comment scinder le hachage donné en ses états itérés (1 possibilité pour les entrées plus petites que la taille d’un bloc de données, beaucoup pour les plus grandes). Ensuite, vous devrez inverser l'itération pour chaque état. Maintenant, pour expliquer pourquoi cela est TRÈS difficile, imaginez-vous essayer de déduire a
et b
de la formule suivante: 10 = a + b
. Il existe 10 combinaisons positives de a
et b
qui peuvent fonctionner. Maintenant, parcourez cela plusieurs fois: tmp = a + b; a = b; b = tmp
. Pour 64 itérations, vous aurez plus de 10 ^ 64 possibilités d'essayer. Et ce n'est qu'un simple ajout où un état est préservé d'itération en itération. Les fonctions de hachage réelles font beaucoup plus que 1 opération (MD5 effectue environ 15 opérations sur 4 variables d'état). Et puisque la prochaine itération dépend de l'état de la précédente et que la précédente est détruite lors de la création de l'état actuel, il est pratiquement impossible de déterminer l'état d'entrée qui a conduit à un état de sortie donné (pour chaque itération non moins). Combinez cela avec le grand nombre de possibilités impliquées, et décoder même un MD5 nécessitera une quantité de ressources presque infinie (mais pas infinie). Tellement de ressources qu'il est en réalité beaucoup moins coûteux de forcer brutalement le hachage si vous avez une idée de la taille de l'entrée (pour des entrées plus petites) que d'essayer même de décoder le hachage.
Ils fournissent un mappage 1: 1 entre une entrée et une sortie de longueur arbitraire. Et ils sont toujours réversibles. La chose importante à noter est que c'est réversible en utilisant une méthode. Et il est toujours 1: 1 pour une clé donnée. Maintenant, il y a plusieurs paires de clés qui pourraient générer la même sortie (en fait, il en existe généralement en fonction de la fonction de cryptage). Les bonnes données cryptées sont impossibles à distinguer du bruit aléatoire. C'est différent d'un bon résultat de hachage qui est toujours d'un format cohérent.
Utilisez une fonction de hachage lorsque vous souhaitez comparer une valeur mais que vous ne pouvez pas stocker la représentation simple (pour un nombre quelconque de raisons). Les mots de passe devraient très bien convenir à ce cas d'utilisation, car vous ne voulez pas les stocker en texte brut pour des raisons de sécurité (et ne devriez pas). Mais que se passe-t-il si vous voulez vérifier un système de fichiers pour des fichiers de musique piratés? Il serait peu pratique de stocker 3 Mo par fichier de musique. Donc, au lieu de cela, prenez le hachage du fichier et stockez-le (md5 stockerait 16 octets au lieu de 3 Mo). De cette façon, il vous suffit de hacher chaque fichier et de le comparer à la base de données stockée (cela ne fonctionne pas aussi bien en pratique à cause du réencodage, du changement des en-têtes de fichier, etc., mais c'est un exemple d'utilisation).
Utilisez une fonction de hachage lorsque vous vérifiez la validité des données d'entrée. C'est pour cela qu'ils sont conçus. Si vous avez 2 entrées et que vous voulez vérifier si elles sont identiques, exécutez les deux via une fonction de hachage. La probabilité d'une collision est astronomique pour les petites tailles d'entrée (en supposant une bonne fonction de hachage). C'est pourquoi il est recommandé pour les mots de passe. Pour les mots de passe de 32 caractères maximum, md5 dispose de 4 fois l’espace de sortie. SHA1 a 6 fois l’espace de sortie (environ). SHA512 a environ 16 fois l’espace de sortie. Vous ne vous souciez pas vraiment de ce que le mot de passe était , vous vous souciez de savoir si c'est le même que celui qui a été stocké. C'est pourquoi vous devez utiliser des hachages pour les mots de passe.
Utilisez le cryptage chaque fois que vous avez besoin de récupérer les données d'entrée. Notez le besoin de Word . Si vous stockez des numéros de carte de crédit, vous devez les récupérer à un moment donné, mais ne souhaitez pas les stocker en texte brut. Au lieu de cela, stockez la version cryptée et gardez la clé aussi sûre que possible.
Les fonctions de hachage sont également utiles pour la signature de données. Par exemple, si vous utilisez HMAC, vous signez une donnée en prenant un hachage des données concaténées avec une valeur connue mais non transmise (une valeur secrète). Donc, vous envoyez le texte brut et le hachage HMAC. Ensuite, le destinataire hache simplement les données soumises avec la valeur connue et vérifie si elles correspondent au HMAC transmis. Si c'est pareil, vous savez qu'il n'a pas été altéré par une partie sans la valeur secrète. Ceci est couramment utilisé dans les systèmes de cookies sécurisés par les frameworks HTTP, ainsi que dans la transmission de messages via HTTP où vous voulez une assurance d'intégrité des données.
Une caractéristique essentielle des fonctions de hachage cryptographiques est qu’elles devraient être très rapides à créer et très difficiles/lentes à inverser (au point qu’il est pratiquement impossible ). Cela pose un problème avec les mots de passe. Si vous stockez sha512(password)
, vous ne faites rien pour vous protéger des tables Rainbow ou des attaques par force brute. Rappelez-vous que la fonction de hachage a été conçue pour la vitesse. Il est donc facile pour un attaquant de simplement exécuter un dictionnaire avec la fonction de hachage et de tester chaque résultat.
L'ajout d'un sel aide, car il ajoute un peu de données inconnues au hachage. Ainsi, au lieu de trouver tout ce qui correspond à md5(foo)
, ils doivent trouver quelque chose qui, ajouté au sel connu, produit md5(foo.salt)
(ce qui est beaucoup plus difficile à faire). Mais cela ne résout toujours pas le problème de vitesse, car s’ils connaissent le sel, c’est une question de contrôle du dictionnaire.
Donc, il y a moyen de gérer cela. Une méthode populaire est appelée renforcement de la clé (ou étirement de la clé). En gros, vous parcourez plusieurs fois un hachage (généralement des milliers). Cela fait deux choses. Tout d'abord, cela ralentit considérablement le temps d'exécution de l'algorithme de hachage. Deuxièmement, si elle est mise en œuvre correctement (passer l'entrée et saler à chaque itération) augmente effectivement l'entropie (espace disponible) pour la sortie, réduisant ainsi les risques de collision. Une implémentation triviale est:
var hash = password + salt;
for (var i = 0; i < 5000; i++) {
hash = sha512(hash + password + salt);
}
Il existe d'autres implémentations plus standard telles que PBKDF2 , BCrypt . Mais cette technique est utilisée par plusieurs systèmes liés à la sécurité (tels que PGP, WPA, Apache et OpenSSL).
La ligne du bas, hash(password)
n'est pas assez bonne. hash(password + salt)
c'est mieux, mais cela ne suffit toujours pas ... Utilisez un mécanisme de hachage étiré pour produire votre mot de passe haché ...
Ne jamais insérer la sortie d'un hachage directement dans la fonction de hachage :
hash = sha512(password + salt);
for (i = 0; i < 1000; i++) {
hash = sha512(hash); // <-- Do NOT do this!
}
La raison en est liée aux collisions. N'oubliez pas que toutes les fonctions de hachage comportent des collisions, car l'espace de sortie possible (le nombre de sorties possibles) est inférieur à l'espace d'entrée. Pour voir pourquoi, regardons ce qui se passe. Pour commencer, supposons qu'il y ait une chance de collision de 0,001% de sha1()
(c'est beaucoup plus faible en réalité, mais à des fins de démonstration fins).
hash1 = sha1(password + salt);
Maintenant, hash1
a une probabilité de collision de 0,001%. Mais lorsque nous faisons la prochaine hash2 = sha1(hash1);
, , toutes les collisions de hash1
deviennent automatiquement des collisions de hash2
. Nous avons donc le taux de hash1 à 0,001%, et le deuxième appel sha1()
s'ajoute à cela. Alors maintenant, hash2
a une probabilité de collision de 0,002%. C'est deux fois plus de chances! Chaque itération ajoutera une autre 0.001%
chance de collision au résultat. Ainsi, avec 1 000 itérations, les chances de collision sont passées de 0,001% à 1%. Maintenant, la dégradation est linéaire et les probabilités réelles sont bien inférieures , mais l’effet est identique (estimation du risque de collision unique avec md5
vaut environ 1/(2128) ou 1/(3x1038). Bien que cela semble petit, merci à l'attaque d'anniversaire ce n'est pas vraiment aussi petit qu'il n'y paraît).
Au lieu de cela, en rajoutant le sel et le mot de passe à chaque fois, vous réintroduisez des données dans la fonction de hachage. Ainsi, les collisions d'un tour en particulier ne sont plus des collisions du tour suivant. Alors:
hash = sha512(password + salt);
for (i = 0; i < 1000; i++) {
hash = sha512(hash + password + salt);
}
Possède les mêmes risques de collision que la fonction native sha512
. C'est ce que tu veux Utilisez cela à la place.
Une fonction de hachage pourrait être considérée comme la même chose que de cuire une miche de pain. Vous commencez avec des entrées (farine, eau, levure, etc.) et après l'application de la fonction de hachage (mélange + cuisson), vous obtenez un résultat: une miche de pain.
Faire l'inverse est extrêmement difficile - vous ne pouvez pas vraiment séparer le pain en farine, eau, levure - une partie de celle-ci a été perdue au cours de la cuisson, et vous ne pouvez jamais dire exactement combien d'eau, de farine ou de levure ont été utilisées. un pain particulier, parce que cette information a été détruite par la fonction de hachage (aka le four).
Théoriquement, de nombreuses variantes d'intrants produiront des pains identiques (par exemple, 2 tasses d'eau et 1 tsbp de levure produisent exactement le même pain que 2,1 tasses d'eau et 0,9 psp de levure), mais vous ne pouvez pas le savoir exactement ce que combo d'intrants a produit.
Le chiffrement, en revanche, pourrait être considéré comme un coffre-fort. Tout ce que vous mettez dedans revient, à condition que vous possédiez la clé avec laquelle vous l'avez enfermée. C'est une opération symétrique. Avec une clé et une entrée, vous obtenez une certaine sortie. Compte tenu de cette sortie et de la même clé, vous récupérez l'entrée d'origine. C'est un mappage 1: 1.
Utilisez des hachages lorsque vous ne voulez pas pouvoir récupérer l'entrée d'origine, utilisez un cryptage pour le faire.
Les hachages prennent des entrées et les transforment en bits (généralement considérés comme un nombre, comme un entier de 32 bits, un entier de 64 bits, etc.). La même entrée produit toujours le même hachage, mais vous perdez PRINCIPALEMENT des informations au cours du processus, de sorte que vous ne pouvez pas reproduire de manière fiable l'entrée d'origine (il y a cependant quelques réserves à cela).
Le cryptage préserve principalement toutes les informations que vous mettez dans la fonction de cryptage, ce qui le rend difficile (voire impossible) pour quiconque de revenir en arrière à l'entrée d'origine sans posséder de clé spécifique.
Exemple simple de hachage
Voici un exemple trivial pour vous aider à comprendre pourquoi le hachage ne peut pas (dans le cas général) récupérer l’entrée originale. Dites que je crée un hachage 1 bit. Ma fonction de hachage prend une chaîne de bits en entrée et définit le hachage sur 1 s'il y a un nombre pair de bits défini dans la chaîne d'entrée, sinon sur 0 s'il existe un nombre impair.
Exemple:
Input Hash
0010 0
0011 1
0110 1
1000 0
Notez qu'il existe de nombreuses valeurs d'entrée qui résultent en un hachage de 0 et d'autres en un 1. Si vous savez que le hachage est 0, vous ne pouvez pas savoir avec certitude en quoi consiste l'entrée d'origine.
À propos, ce hachage à 1 bit n’est pas vraiment artificiel ... regardez bit de parité .
Exemple simple de cryptage
Vous pouvez chiffrer le texte en utilisant une simple lettre de substitution, par exemple si l'entrée est A, vous écrivez B. Si l'entrée est B, vous écrivez C. Jusqu'au bout de l'alphabet, où si l'entrée est Z, vous écris encore une fois.
Input Encrypted
CAT DBU
Zoo APP
Tout comme dans l'exemple de hachage simple, ce type de cryptage a été utilisé historiquement .
Voici un aperçu des techniques de hachage et de cryptage/décryptage.
Hachage:
Si vous hachez tout texte brut à nouveau vous ne peut pas obtenir le même texte brut à partir d'un texte haché . Simplement, c'est un processus à sens unique.
Cryptage et décryptage:
Si vous cryptez tout texte brut avec une clé à nouveau vous peut obtenir le même texte brut en effectuant le déchiffrement sur du texte chiffré avec le même (symétrique)/clé différente (asymentrique).
UPDATE: Pour traiter les points mentionnés dans la question modifiée.
1. Quand utiliser les hachages contre les chiffrements
Le hachage est utile si vous souhaitez envoyer un fichier à quelqu'un. Mais vous craignez que quelqu'un d'autre n'intercepte le fichier et ne le modifie. Ainsi, le destinataire peut s’assurer que le fichier est correct si vous publiez la valeur de hachage publiquement. Ainsi, le destinataire peut calculer la valeur de hachage du fichier reçu et vérifier qu’elle correspond à la valeur de hachage.
Le cryptage est bon si vous dites avoir un message à envoyer à quelqu'un. Vous chiffrez le message avec une clé et le destinataire décrypte avec la même clé (ou peut-être même une clé différente) pour récupérer le message d'origine. crédits
2. Qu'est-ce qui différencie un algorithme de hachage ou de chiffrement (d'un niveau théorique/mathématique), c'est-à-dire ce qui rend les hachages irréversibles (sans l'aide d'un arbre Arc-en-ciel)
Fondamentalement , le hachage est une opération qui perd des informations mais pas un chiffrement . Regardons la différence de manière mathématique simple pour notre compréhension facile , bien sûr, les deux ont une opération mathématique beaucoup plus compliquée avec des répétitions impliquées
Cryptage/décryptage (réversible):
Addition :
4 + 3 = 7
Ceci peut être inversé en prenant la somme et en soustrayant un des addends
7 - 3 = 4
Multiplication :
4 * 5 = 20
Cela peut être inversé en prenant le produit et en divisant par l'un des facteurs
20 / 4 = 5
Nous pouvons donc supposer ici que l’un des addends/facteurs est une clé de diminution et que le résultat (7,20) est un texte chiffré.
Hashing (non réversible):
Division modulo :
22 % 7 = 1
Cela ne peut pas être inversé car il n'y a pas d'opération que vous puissiez faire sur le quotient et le dividende pour reconstituer le diviseur (ou inversement).
Pouvez-vous trouver une opération à remplir où le "?" est?
1 ? 7 = 22 1 ? 22 = 7
Les fonctions de hachage ont donc la même qualité mathématique que la division modulo et perd les informations.
Ma seule doublure ... généralement l'intervieweur voulait la réponse ci-dessous.
Le hachage est un moyen. Vous ne pouvez pas convertir vos données/chaînes à partir d'un code de hachage.
Le cryptage est bidirectionnel - vous pouvez décrypter à nouveau la chaîne cryptée si vous avez la clé.
Une fonction de hachage convertit une quantité de texte de taille variable en un texte de taille fixe.
Source: https://en.wikipedia.org/wiki/Hash_function
Permet de le voir en action. J'utilise php pour cela.
HACHER:
$str = 'My age is 29';
$hash = hash('sha1', $str);
echo $hash; // OUTPUT: 4d675d9fbefc74a38c89e005f9d776c75d92623e
DEHASH:
SHA1 est un hachage à sens unique. Ce qui signifie que vous ne pouvez pas hacher le hachage. Cependant, vous pouvez forcer brutalement le hachage. Veuillez consulter: https://hashkiller.co.uk/sha1-decrypter.aspx .
MD5, est un autre hash. Un MD5 dehasher peut être trouvé sur ce site: https://www.md5online.org/ .
Une fonction de cryptage transforme un texte en cryptogramme non sensé à l'aide d'une clé de cryptage, et inversement.
Source: https://en.wikipedia.org/wiki/Encryption
Nous allons plonger dans un code PHP qui gère le cryptage.
--- l'extension Mcrypt ---
CRYPTER:
$cipher = MCRYPT_RIJNDAEL_128;
$key = 'A_KEY';
$data = 'My age is 29';
$mode = MCRYPT_MODE_ECB;
$encryptedData = mcrypt_encrypt($cipher, $key , $data , $mode);
var_dump($encryptedData);
//OUTPUT:
string '„Ùòyªq³¿ì¼üÀpå' (length=16)
Décrypter:
$decryptedData = mcrypt_decrypt($cipher, $key , $encryptedData, $mode);
$decryptedData = rtrim($decryptedData, "\0\4"); // Remove the nulls and EOTs at the END
var_dump($decryptedData);
//OUTPUT:
string 'My age is 29' (length=12)
--- L'extension OpenSSL ---
L'extension Mcrypt est obsolète en 7.1. et supprimé en php 7.2. L'extension OpenSSL doit être utilisée dans php 7. Voir les extraits de code ci-dessous:
$key = 'A_KEY';
$data = 'My age is 29';
// ENCRYPT
$encryptedData = openssl_encrypt($data , 'AES-128-CBC', $key, 0, 'IV_init_vector01');
var_dump($encryptedData);
// DECRYPT
$decryptedData = openssl_decrypt($encryptedData, 'AES-128-CBC', $key, 0, 'IV_init_vector01');
var_dump($decryptedData);
//OUTPUT
string '4RJ8+18YkEd7Xk+tAMLz5Q==' (length=24)
string 'My age is 29' (length=12)
Symmetric Encryption:
Le chiffrement symétrique peut également être appelé clé partagée ou chiffrement secret partagé. Dans le chiffrement symétrique, une clé unique est utilisée pour chiffrer et déchiffrer le trafic.
Chiffrement asymétrique:
Le cryptage asymétrique est également appelé cryptographie à clé publique. Le cryptage asymétrique diffère du cryptage symétrique principalement par le fait que deux clés sont utilisées: une pour le cryptage et une pour le décryptage. L'algorithme de chiffrement asymétrique le plus courant est RSA
.
Comparé au cryptage symétrique, le cryptage asymétrique impose une charge de calcul élevée et a tendance à être beaucoup plus lent. Ainsi, il n'est généralement pas utilisé pour protéger les données utiles. Au lieu de cela, sa principale force réside dans sa capacité à établir un canal sécurisé sur un support non sécurisé (par exemple, Internet). Ceci est accompli par l'échange de clés publiques, qui ne peuvent être utilisées que pour chiffrer des données. La clé privée complémentaire, qui n'est jamais partagée, sert à déchiffrer.
Hachage:
Enfin, le hachage est une forme de sécurité cryptographique différente du cryptage. Alors que le chiffrement est un processus en deux étapes utilisé pour chiffrer d'abord, puis pour déchiffrer un message, le hachage condense le message en une valeur de longueur fixe irréversible, ou hachage. MD5
et SHA-1
sont les deux algorithmes de hachage les plus courants rencontrés en réseau.
Lisez plus ici: http://packetlife.net/blog/2010/nov/23/symmetric-asymmetric-encryption-hashing/
Le chiffrement et les algorithmes de hachage fonctionnent de manière similaire. Dans chaque cas, il est nécessaire de créer confusion et diffusion parmi les bits. En résumé, la confusion crée une relation complexe entre la clé et le texte chiffré, et la diffusion diffuse les informations de chaque bit.
De nombreuses fonctions de hachage utilisent en réalité des algorithmes de chiffrement (ou des primitives d’algorithmes de chiffrement). Par exemple, le candidat SHA-3 Skein utilise Threefish comme méthode sous-jacente pour traiter chaque bloc. La différence est qu'au lieu de conserver chaque bloc de texte chiffré, ils sont fusionnés de manière destructrice et déterministe à une longueur fixe
Utilisez des hachages quand vous devez aller dans un sens. Par exemple, pour les mots de passe d'un système, vous utilisez le hachage, car vous ne vérifierez jamais que la valeur entrée par l'utilisateur, après le hachage, correspond à la valeur de votre référentiel. Avec le cryptage, vous pouvez aller de deux manières.
les algorithmes de hachage et les algorithmes de chiffrement ne sont que des algorithmes mathématiques. Donc, à cet égard, ils ne sont pas différents - ce sont toutes des formules mathématiques. Sémantique sage, cependant, il y a la très grande distinction entre le hachage (unidirectionnel) et le cryptage (bidirectionnel). Pourquoi les hashes sont-ils irréversibles? Parce qu'ils sont conçus pour être ainsi, parce que parfois vous voulez une opération à sens unique.
en ce qui concerne la sécurité pour la transmission de données, c’est-à-dire que vous utilisez le cryptage. Tous les cryptages nécessitent une clé.
en ce qui concerne l'autorisation, vous utilisez le hachage. Il n'y a pas de clé dans le hachage.
Le hachage prend n'importe quelle quantité de données (binaire ou texte) et crée un hachage de longueur constante représentant une somme de contrôle pour les données. Par exemple, le hachage peut être 16 octets. Différents algorithmes de hachage produisent des hachages de tailles différentes. Vous ne pouvez évidemment pas recréer les données d'origine à partir du hachage, mais vous pouvez à nouveau hacher les données pour voir si la même valeur de hachage est générée. Les mots de passe unidirectionnels basés sur Unix fonctionnent de cette façon. Le mot de passe est stocké sous forme de valeur de hachage. Pour vous connecter à un système, le mot de passe que vous tapez est haché et la valeur de hachage est comparée à celle du mot de passe réel. S'ils correspondent, vous devez avoir saisi le bon mot de passe
pourquoi le hachage est-il irréversible?
Le hachage n'est pas réversible car le mappage entrée/hachage n'est pas 1/1. Le fait de mapper deux entrées sur la même valeur de hachage est généralement appelé "collision de hachage". Pour des raisons de sécurité, l’une des propriétés d’une "bonne" fonction de hachage est que les collisions sont rares dans la pratique.