Question Différence fondamentale entre les algorithmes de hachage et de cryptage


Je vois beaucoup de confusion entre les hachages et les algorithmes de cryptage et j'aimerais avoir des conseils d'experts sur:

  1. Quand utiliser les hachages et les cryptages

  2. Ce qui rend un algorithme de hachage ou de cryptage différent (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)

Voilà quelque similaire SO Des questions qui ne sont pas allées dans le détail autant que je cherchais:

Quelle est la différence entre Obfuscation, Hashing et Encryption?
Différence entre le cryptage et le hachage


444
2018-02-09 17:30


origine


Réponses:


Eh bien, vous pourriez le chercher Wikipédia... Mais puisque vous voulez une explication, je ferai de mon mieux ici:

Fonctions de hachage

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 y a une cartographie à sens unique. C'est toujours un mapping multiple: il y aura toujours des collisions car chaque fonction produit une sortie plus petite que ce qu'elle est capable d'entrer (si vous alimentez tous les fichiers 1mb possibles dans MD5, vous aurez une tonne de collisions).

La raison pour laquelle ils sont difficiles (ou impossibles en pratique) à inverser est la façon dont ils fonctionnent en interne. La plupart des fonctions de hachage cryptographiques effectuent plusieurs itérations sur le jeu d’entrée pour produire la sortie. Donc, si nous regardons chaque segment de longueur fixe d'entrée (qui dépend de l'algorithme), la fonction de hachage appellera cela l'état actuel. Il va ensuite parcourir l'état et le remplacer par un nouveau et l'utiliser comme retour sur lui-même (MD5 le fait 64 fois pour chaque bloc de données de 512 bits). Il combine ensuite 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 diviser le hachage donné en é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 entrées). Ensuite, vous devrez inverser l'itération pour chaque état. Maintenant, pour expliquer pourquoi c'est TRÈS dur, imaginez essayer de déduire a et b de la formule suivante: 10 = a + b. Il y a 10 combinaisons positives de a et b ça peut marcher. Maintenant, bouclez dessus un tas de fois: tmp = a + b; a = b; b = tmp. Pour 64 itérations, vous auriez plus de 10 64 possibilités à essayer. Et ce n'est qu'une simple addition où un état est préservé de l'itération à l'itération. Les fonctions de hachage réelles font beaucoup plus qu'une opération (MD5 effectue environ 15 opérations sur 4 variables d'état). Et puisque l'itération suivante dépend de l'état du précédent et que le précédent est détruit en créant l'état courant, il est pratiquement impossible de déterminer l'état d'entrée qui a conduit à un état de sortie donné (pour chaque itération). Combinez cela, avec le grand nombre de possibilités que cela implique, et le décodage, même d’un MD5, prendra une quantité de ressources presque infinie (mais pas infinie). Tant de ressources qu'il est en réalité beaucoup moins cher de forcer le hachage brutalement si vous avez une idée de la taille de l'entrée (pour les petites entrées) que d'essayer même de décoder le hachage.

Fonctions de chiffrement

Ils fournissent une correspondance 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 c'est toujours 1: 1 pour une clé donnée. Maintenant, il y a plusieurs entrées: les paires de clés qui peuvent générer la même sortie (en fait, il y en a généralement, en fonction de la fonction de cryptage). Les bonnes données cryptées sont indiscernables du bruit aléatoire. Ceci est différent d'une bonne sortie de hachage qui a toujours un format cohérent.

Cas d'utilisation

Utilisez une fonction de hachage lorsque vous souhaitez comparer une valeur mais ne pouvez pas stocker la représentation en clair (pour un certain nombre de raisons). Les mots de passe devraient très bien convenir à ce cas d'utilisation puisque vous ne voulez pas les stocker en texte brut pour des raisons de sécurité (et ne le devriez pas). Mais que faire si vous voulez vérifier un système de fichiers pour les fichiers musicaux piratés? Il serait impraticable de stocker 3 Mo par fichier de musique. Donc, à la place, prenez le hachage du fichier, et stockez-le (md5 stockerait 16 octets au lieu de 3mb). De cette façon, il suffit de hacher chaque fichier et de le comparer à la base de données de hachage stockée (cela ne marche pas aussi bien en ré-encodant, en changeant les en-têtes de fichiers, etc.).

Utilisez une fonction de hachage lorsque vous vérifiez la validité des données d'entrée. C'est pour ça 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 extrêmement faible 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 jusqu'à 32 caractères, md5 a 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 du mot de passe était, vous vous souciez si c'est la même chose que celle qui a été stockée. C'est pourquoi vous devriez 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 mot avoir besoin. Si vous stockez des numéros de carte de crédit, vous devez les récupérer à un moment donné, mais vous ne souhaitez pas les stocker en texte brut. Donc, au lieu de cela, stocker la version cryptée et garder la clé aussi sûre que possible.

Les fonctions de hachage sont également excellentes pour la signature de données. Par exemple, si vous utilisez HMAC, vous signez un élément de données 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 récepteur hache simplement les données soumises avec la valeur connue et vérifie s'il correspond au HMAC transmis. Si c'est la même chose, vous savez que cela n'a pas été falsifié par une partie sans 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é dans les données.

Une note sur les hashes pour les mots de passe:

Une caractéristique clé des fonctions de hachage cryptographiques est qu’elles doivent être très rapides à créer et très difficile / lent à inverser (tellement que c'est pratiquement impossible). Cela pose un problème avec les mots de passe. Si vous stockez sha512(password), vous ne faites rien pour vous prémunir contre les tables arc-en-ciel ou les attaques par force brute. Rappelez-vous, la fonction de hachage a été conçue pour la vitesse. Il est donc trivial pour un attaquant d'exécuter un dictionnaire via la fonction de hachage et de tester chaque résultat.

L'ajout d'un sel facilite les choses car il ajoute un peu de données inconnues au hachage. Donc, au lieu de trouver quelque chose 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 juste une question d'exécution du dictionnaire.

Donc, il y a des façons de gérer cela. Une méthode populaire est appelée renforcement des clés (ou étirement de clé). Fondamentalement, vous itérez un hash plusieurs fois (des milliers d'habitude). Cela fait deux choses. Premièrement, il ralentit considérablement l'exécution de l'algorithme de hachage. Deuxièmement, si elle est implémentée correctement (en passant l’entrée et le retour de sel à chaque itération), l’entropie augmente (espace disponible) pour la sortie, ce qui réduit 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 un certain nombre de systèmes liés à la sécurité (tels que PGP, WPA, Apache et OpenSSL).

La ligne du bas, hash(password) n'est pas assez bon. hash(password + salt) c'est mieux, mais pas encore assez ... Utilisez un mécanisme de hachage tendu pour produire vos hachages de mot de passe ...

Une autre remarque sur les étirements triviaux

N'envoyez en aucun cas 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 de ceci a à voir avec des collisions. Rappelez-vous que toutes les fonctions de hachage ont des collisions car l'espace de sortie possible (le nombre de sorties possibles) est plus petit que l'espace d'entrée. Pour voir pourquoi, regardons ce qui se passe. Pour faire une préface, supposons qu'il y a un risque de collision de 0,001% sha1() (ses beaucoup inférieur dans la réalité, mais à des fins de démonstration).

hash1 = sha1(password + salt);

À présent, hash1 a une probabilité de collision de 0,001%. Mais quand on fait la prochaine hash2 = sha1(hash1);, toutes les collisions de hash1 deviennent automatiquement des collisions de hash2. Alors maintenant, nous avons le taux de hash1 à 0,001%, et le 2ème sha1() appel ajoute à cela. Alors maintenant, hash2 a une probabilité de collision de 0,002%. C'est deux fois plus de chances! Chaque itération en ajoutera une autre 0.001% chance de collision au résultat. Donc, avec 1000 itérations, le risque de collision a sauté d'un trivial de 0,001% à 1%. Maintenant, la dégradation est linéaire, et les vrais probabilités sont loin plus petit, mais l'effet est le même (une estimation de la probabilité d'une collision unique avec md5 est d'environ 1 / (2128) ou 1 / (3x1038). Bien que cela semble petit, grâce à l'attaque d'anniversaire ce n'est pas vraiment aussi petit qu'il y paraît.

Au lieu de cela, en ré-ajoutant le sel et le mot de passe à chaque fois, vous réintroduisez les données dans la fonction de hachage. Donc, les collisions d'un tour 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);
}

A la même chance de collision que le natif sha512 fonction. C'est ce que tu veux. Utilisez cela à la place.


656
2018-02-09 17:36



Une fonction de hachage peut être considérée comme la cuisson d'un pain. Vous commencez avec des intrants (farine, eau, levure, etc ...) et après avoir appliqué la fonction de hachage (mélange + cuisson), vous obtenez une sortie: une miche de pain.

Aller dans l'autre sens est extrêmement difficile - vous ne pouvez pas vraiment séparer le pain en farine, eau, levure - une partie de ce pain a été perdu pendant le processus de cuisson et vous ne pouvez jamais dire exactement combien d'eau, de farine ou de levure un pain particulier, parce que cette information a été détruite par la fonction de hachage (alias le four).

De nombreuses variantes d'intrants produiront théoriquement des pains identiques (par exemple, 2 tasses d'eau et 1 tsbp de levure produiront exactement le même pain que 2,1 tasses d'eau et 0,9 pb de levure), mais compte tenu de l'un de ces pains, exactement ce que combo d'entrées a produit.

Le cryptage, quant à lui, pourrait être considéré comme un coffre-fort. Tout ce que vous mettez là-bas revient, tant que vous possédez la clé avec laquelle il a été enfermé en premier lieu. C'est une opération symétrique. Étant donné une clé et une entrée, vous obtenez un certain résultat. Étant donné cette sortie, et la même clé, vous récupérerez l'entrée d'origine. C'est une cartographie 1: 1.


146
2018-02-09 17:40



Utilisez les hachages lorsque vous ne voulez pas pouvoir récupérer l'entrée d'origine, utilisez le chiffrement lorsque vous le faites.

Les hachages prennent quelques entrées et les transforment en quelques 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 produira toujours le même hachage, mais vous perdez PRINCIPALEMENT des informations dans le processus, de sorte que vous ne pouvez pas reproduire de manière fiable l'entrée originale (il existe toutefois quelques réserves).

Le cryptage préserve principalement toutes les informations que vous mettez dans la fonction de cryptage, rend difficile (idéalement impossible) pour quiconque de revenir à 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 d'origine. Disons que je crée un hachage de 1 bit. Ma fonction de hachage prend une chaîne de bits en entrée et met le hash à 1 s'il y a un nombre pair de bits dans la chaîne d'entrée, sinon 0 s'il y avait un nombre impair.

Exemple:

Input    Hash
0010     0
0011     1
0110     1
1000     0

Notez qu'il existe de nombreuses valeurs en entrée qui entraînent un hachage de 0, et que beaucoup entraînent un hachage de 1. Si vous savez que le hachage est 0, vous ne pouvez pas savoir avec certitude quelle était la source initiale.

Au fait, ce hachage de 1 bit n’est pas exactement imaginé ... bit de parité.

Exemple simple de cryptage

Vous pouvez chiffrer le texte en utilisant une simple substitution de lettre, par exemple si l'entrée est A, vous écrivez B. Si l'entrée est B, vous écrivez C. Jusqu'à la fin de l'alphabet, où si l'entrée est Z, vous écrivez A à nouveau.

Input   Encrypted
CAT     DBU
ZOO     APP

Tout comme le simple exemple de hachage, ce type de chiffrement a été utilisé historiquement.


40
2018-02-09 17:33



Vue d'ensemble de base des techniques de hachage et de cryptage / décryptage sont.

Hachage

Si vous hacher tout texte brut encore toi ne peut pas obtenir la même plaine   texte de texte haché. Simplement, c'est un processus à sens unique.

hashing


Cryptage et décryptage:

Si vous Crypter tout texte brut avec une clé à nouveau vous pouvez   obtenir le même texte en clair en faisant décryptage sur du texte chiffré avec la même clé (symétrique) / différente (asymentaire).

encryption and decryption


METTRE À JOUR: Répondre aux points mentionnés dans la question modifiée.

1. Quand utiliser les hachages et les cryptages

Hachage est utile si vous souhaitez envoyer un fichier à quelqu'un. Mais vous avez peur que quelqu'un d'autre puisse intercepter le fichier et le changer. Donc un   façon que le destinataire peut s'assurer que c'est le bon fichier est si   vous publiez la valeur de hachage publiquement. De cette façon, le destinataire peut calculer   la valeur de hachage du fichier reçu et vérifier qu'elle correspond au hachage   valeur.

Chiffrement c'est bien si vous dites avoir un message à envoyer à quelqu'un. Vous cryptez le message avec une clé et le destinataire déchiffre avec le   Même clé (ou peut-être même différente) pour récupérer le message original.    crédits


2. Ce qui rend un algorithme de hachage ou de cryptage différent (d'un niveau théorique / mathématique), c'est-à-dire ce qui rend les hachages irréversibles     (sans aide d'un arc-en-ciel) 

Fondamentalement le hachage est un   opération qui perd l'information mais pas le cryptage. Regardons   la différence de manière mathématique simple pour notre compréhension facile,   bien sûr, les deux ont un fonctionnement mathématique beaucoup plus compliqué avec   les répétitions impliquées

Cryptage / décryptage (réversible):

Une addition:

4 + 3 = 7  

Cela peut être inversé en prenant la somme et en soustrayant l'un des     ajouter

7 - 3 = 4     

Multiplication:

4 * 5 = 20  

Cela peut être inversé en prenant le produit et en le divisant par l'un des     facteurs

20 / 4 = 5    

On peut donc supposer que l'un des addends / facteurs est une clé de répartition et que le résultat (7,20) est un texte chiffré.


Hashing (pas réversible):

Division modulo:

22 % 7 = 1   

Cela ne peut pas être inversé car il n'y a pas d'opération que vous pouvez faire avec le quotient et le dividende à     reconstituer le diviseur (ou vice versa).

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 l'information.

crédits


30
2018-04-07 08:48



Mon seul paquebot ... généralement Interviewer voulait la réponse ci-dessous.

Hashing est un moyen. Vous ne pouvez pas convertir vos données / chaîne à partir d'un code de hachage.

Le chiffrement est à deux niveaux: vous pouvez déchiffrer à nouveau la chaîne chiffrée si vous avez la clé avec vous.


24
2018-01-29 05:10



UNE Fonction de hachage transforme une quantité de texte de taille variable en un texte de taille fixe.

Hash

La source: https://en.wikipedia.org/wiki/Hash_function

Un Fonction de cryptage  transforme un texte en un cryptogramme absurde en utilisant une clé de cryptage et inversement. enter image description here

La source: https://en.wikipedia.org/wiki/Encryption

Voyons cela 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 déchaîner le hachage. Cependant, vous pouvez forcer le hachage. S'il te plait regarde: https://hashkiller.co.uk/sha1-decrypter.aspx. Vous pouvez trouver un MD5 dehasher sur ce site: http://md5portal.com/.

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)

11
2018-04-10 09:14



Chiffrement symétrique:

Le cryptage symétrique peut également être appelé clé partagée ou cryptage secret partagé. Dans le chiffrement symétrique, une seule clé est utilisée pour chiffrer et déchiffrer le trafic.

enter image description here

Chiffrement asymétrique:

Le cryptage asymétrique est également connu sous le nom de cryptographie à clé publique. Le chiffrement asymétrique diffère du chiffrement symétrique, car deux clés sont utilisées: une pour le chiffrement et une pour le déchiffrement. L'algorithme de chiffrement asymétrique le plus courant est RSA.

Par rapport au cryptage symétrique, le cryptage asymétrique impose une charge de calcul élevée et tend à être beaucoup plus lente. 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é (Internet, par exemple). 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, est utilisée pour décrypter.

enter image description here

Hachage

Enfin, le hachage est une forme de sécurité cryptographique différente du chiffrement. Alors que le chiffrement est un processus en deux étapes utilisé pour chiffrer puis déchiffrer un message, le hachage condense un message en une valeur irréversible de longueur fixe, ou hachage. Deux des algorithmes de hachage les plus courants observés en réseau sont MD5 et SHA-1.

enter image description here

Lire plus ici:http://packetlife.net/blog/2010/nov/23/symmetric-asymmetric-encryption-hashing/


7
2017-07-03 08:12