Question:
Comment déterminer quel type d'encodage / cryptage a été utilisé?
Karthik
2011-05-20 16:12:11 UTC
view on stackexchange narkive permalink

Existe-t-il un moyen de trouver quel type de cryptage / encodage est utilisé? Par exemple, je teste une application Web qui stocke le mot de passe dans la base de données dans un format crypté ( WeJcFMQ / 8 + 8QJ / w0hHh + 0g == ). Comment déterminer le hachage ou le chiffrement utilisé?

Une partie du contenu (ou des liens pointant vers) une méthodologie vise à expliquer comment identifier certains types de crypto ou d'encodage dans un scénario de connaissance totalement nulle. La plupart de ces réponses sont «c'est impossible» et mon instinct me dit que rien dans notre industrie n'est impossible.
@atdre Merci pour la prime. La question semble focalisée sur les formats de hachage de mot de passe - est-ce que c'est aussi votre objectif? Cela me semble le mieux, et si les gens veulent répondre à la question sur les formats de fichiers, ils peuvent poser une autre question.
@atdre: "Impossible" est généralement un raccourci pour "irréalisable avec la technologie actuelle / ne se terminera pas avant la mort par la chaleur de l'univers".
@nealmcb: Identification du non-clair chiffré ou codé.
J'ai posé une question similaire sur SE: http://stackoverflow.com/questions/988642/how-would-i-reverse-engineer-a-cryptographic-algorithm
Vous pouvez utiliser un détecteur en ligne tel que: [https://md5hashing.net/hash_type_checker[ ](https://md5hashing.net/hash_type_checker)dans votre cas, il indique: ** Base64 ** Encodage
Neuf réponses:
Thomas Pornin
2011-05-23 20:00:49 UTC
view on stackexchange narkive permalink

Votre exemple de chaîne ( WeJcFMQ / 8 + 8QJ / w0hHh + 0g == ) est un encodage Base64 pour une séquence de 16 octets, qui ne ressemble pas à un ASCII ou UTF-8 significatif. Si c'est une valeur stockée pour la vérification du mot de passe (c'est-à-dire pas vraiment un mot de passe "chiffré", plutôt un mot de passe "haché") alors c'est probablement le résultat d'une fonction de hachage calculé sur le mot de passe; la seule fonction de hachage classique avec une sortie de 128 bits est MD5. Mais cela peut concerner n'importe quoi.

La manière "normale" de le savoir est de regarder le code de l'application. Le code de l'application est incarné de manière tangible et lourde (fichiers exécutables sur un serveur, code source quelque part ...) qui n'est pas, et ne peut pas être, autant protégée qu'une clé secrète. L'ingénierie inverse est donc la «voie à suivre».

À l'exception de l'ingénierie inverse, vous pouvez faire quelques expériences pour essayer de faire des suppositions éclairées:

  • Si le même utilisateur " change "son mot de passe mais le réutilise, la valeur stockée change-t-elle? Si oui, alors une partie de la valeur est probablement un "salt" aléatoire ou IV (en supposant un cryptage symétrique).
  • En supposant que la valeur est déterministe à partir du mot de passe d'un utilisateur donné, si deux utilisateurs choisissent le même mot de passe, aboutit-il à la même valeur stockée? Si non, le nom d'utilisateur fait probablement partie du calcul. Vous pouvez essayer de calculer MD5 ("nom d'utilisateur: mot de passe") ou d'autres variantes similaires, pour voir si vous obtenez une correspondance.
  • La longueur du mot de passe est-elle limitée? À savoir, si vous définissez un mot de passe de 40 caractères et que vous ne parvenez pas à vous authentifier en tapant uniquement les 39 premiers caractères, cela signifie que tous les caractères sont importants, ce qui implique qu’il s’agit vraiment de hachage du mot de passe , pas encryption (la valeur stockée est utilisée pour vérifier un mot de passe, mais le mot de passe ne peut pas être récupéré à partir de la valeur stockée seule).
Merci pour les entrées. Veuillez m'en dire plus sur la façon dont vous avez confirmé son encodage Base64 pour une séquence de 16 octets. ** En ce qui concerne vos tests, ** Oui, il s'agit d'une valeur stockée pour la vérification du mot de passe. 1) si un utilisateur change de mot de passe, la valeur stockée change également. 2) si deux utilisateurs choisissent le même mot de passe, la valeur stockée est la même 3) la longueur du mot de passe n'est pas limitée.
@Learner: _n'importe quelle_ séquence de 24 caractères, telle que les 22 premiers sont des lettres, des chiffres, '+' ou '/', et les deux derniers sont des signes '=', est un codage Base64 valide d'une valeur de 128 bits. Et toute valeur de 128 bits, lorsqu'elle est codée avec Base64, produit une telle séquence.
C'est la bonne réponse, même si je voulais entendre quelques astuces potentielles si le code de l'application n'est pas disponible. Si vous avez affaire à une application binaire à source fermée - consultez http://aluigi.org/mytoolz.htm#signsrch
S'il s'agit de MD5, vous pouvez essayer l'un des sites Web de craquage MD5 comme http://www.md5decrypter.co.uk/. Aucun de ceux-ci n'est rapide ou garanti de donner un résultat. Google pour "md5 cracking" pour en savoir plus. Cela vous donnera également une liste étendue à http://www.stottmeister.com/blog/2009/04/14/how-to-crack-md5-passwords/
john
2011-05-20 16:22:41 UTC
view on stackexchange narkive permalink

Edit: je viens de remarquer un script très cool nommé hashID. Le nom le décrit assez bien.

~~~

De manière générale, utiliser l'expérience pour faire des suppositions éclairées est la façon dont ces choses sont faites.

Voici un liste avec un très grand nombre de résultats de hachage afin que vous sachiez à quoi chacun ressemble et créez des signatures / motifs ou vérifiez simplement optiquement.

Il y a deux principales choses que vous devez d'abord faites attention à:

  • la longueur du hachage (chaque fonction de hachage a une longueur de sortie spécifique)
  • l'alphabet utilisé (est-ce que toutes les lettres anglaises? les nombres 0-9 et AF donc hex? Quels caractères spéciaux y a-t-il s'il y en a?)

Plusieurs programmes de craquage de mots de passe (John the ripper par exemple) appliquent une correspondance de motif sur l'entrée pour deviner l'algorithme utilisé, mais cela ne fonctionne que sur les hachages génériques. Par exemple, si vous prenez une sortie de hachage et faites pivoter chaque lettre de 1, la plupart des schémas de correspondance de motifs échoueront.

merci .. j'ai jeté un coup d'œil et essayé avec quelques mots de passe. mais la méthode fonctionne étant donné le scénario, nous savons que le mot de passe est haché et non chiffré, non?
Les mots de passe ne sont généralement pas chiffrés, ils sont hachés et généralement représentés sous la forme que la fonction les génère - vous pouvez donc trouver bon nombre de ces formes dans les liens ci-dessus. En fin de compte, la sortie de toutes les fonctions n'est que des chiffres binaires qui sont généralement représentés et stockés soit sous forme de représentation hexadécimale, soit sous forme de représentation base64.
Ce programme est une poubelle.Il ne peut même pas identifier un hachage base64.
Base64 n'est pas un hachage, c'est un encodage.
Yaur
2011-05-23 08:34:11 UTC
view on stackexchange narkive permalink

Ce que vous avez publié est 16 octets (128 bits) de données codées en base 64. Le fait qu'il soit encodé en base 64 ne nous en dit pas beaucoup car la base 64 n'est pas un algorithme de chiffrement / hachage, c'est un moyen d'encoder des données binaires en texte. Cela signifie que ce bloc comprend une information utile, à savoir que la sortie a une longueur de 16 octets. Nous pouvons comparer cela à la taille de bloc des schémas couramment utilisés et comprendre ce que cela ne peut pas être. Les schémas de loin les plus courants sont:

La prochaine chose que nous devons faire est de regarder d'autres blocs de texte chiffré pour trouver la réponse à la question suivante:

  • Tous les textes chiffrés ont-ils la même longueur, même pour des longueurs d'entrée différentes?

Si tous les blocs ne sont pas de la même longueur, vous ne regardez pas d'algorithme de hachage, mais un cryptage. Étant donné que la sortie sera toujours un multiple de la taille du bloc sous-jacent, la présence d'un bloc qui n'est pas également divisible par 16 octets signifierait qu'il ne peut pas être AES et doit donc être DES ou 3DES.

Si vous avoir la possibilité de mettre un mot de passe et d'observer la sortie, cela peut être déterminé très rapidement. Entrez simplement un mot de passe de 17 caractères et regardez la longueur. Si ses 16 octets vous avez MD5, 20 octets signifie SHA-1, 24 octets signifie DES ou 3DES, 32 octets signifie AES.

:-p je ne comprends pas .. est-ce une base de données 64 encodées ?? Comment? et je n'ai certainement pas obtenu la partie où vous dites "si des blocs ne sont pas divisibles de manière égale par 16 octets, c'est probablement DES ou 3DES, sinon AES très probablement", les pls m'éclairent à ce sujet. :)
@The Learner J'ai ajouté à la réponse pour la clarifier. Si vous pouvez utiliser le texte brut choisi, vous pouvez probablement le résoudre à partir de cela.
merci beaucoup .. je commence à avoir la deuxième partie. et après avoir posé cette question ici, j'ai lu quelque part dans Google que le hachage est plusieurs-à-un, ce qui signifie que de nombreux textes différents pourraient être hachés vers une même sortie (veuillez me corriger si je me trompe). En arrivant à notre scénario, tous les blocs de texte chiffrés ne sont pas de la même longueur. Alors maintenant, puis-je être sûr qu'ils ne sont pas hachés mais chiffrés? Mais quand même, je n'ai pas compris comment vous avez dit que les données que j'ai publiées sont 16 octets de données encodées en base 64. S'il y a un chiffrement ou un hachage, comment puis-je dire qu'il s'agit de données de 16 ou 32 octets?
@the apprenant le = car le remplissage est caractéristique de base64. Cet outil http://home2.paulschou.net/tools/xlate/ (à partir d'une recherche google sur le décodeur hexadécimal base64) convertira de la base 64 en un tableau de valeurs hexadécimales. collez simplement votre texte dans la boîte de base 64 et cliquez sur décoder et compter les octets. vous pouvez également estimer en prenant le nombre de caractères dans la chaîne base64 et en multipliant par 0,75
@Karthik,, il y a très peu de façons de représenter un nombre (ce qui est le résultat final du hachage ou du chiffrement) sous forme de texte compact et lisible par l'homme.Les voies dominantes sont hexadécimales (A-F, 0-9) et base 64 (A-Z, a-z, 0-9, +, /).Il est également techniquement possible d'essayer de visualiser les données sous forme d'encodage de texte (ASCII, UTF-8, etc.), bien que ce ne soit généralement qu'un signe de ne pas savoir comment afficher les données (par exemple, en essayant d'ouvrir un fichier binaire dansbloc-notes).Vous le reconnaîtrez principalement en regardant simplement quels types de personnages apparaissent et en devinant à partir de là.
Ensuite, la base 64 a également le remplissage révélateur (les `=` s).C'est vraiment le plus grand indicateur d'être base64.Mais alors vous devez vous rappeler que de nombreux endroits ne stockent pas * juste * un hachage, mais ont en fait une représentation textuelle qui inclut des séparateurs et d'autres champs (par exemple, pour salt, un identifiant dont l'algorithme de hachage a été utilisé, etc.).Cela permet franchement de glaner beaucoup plus d'informations, mais cela ne s'applique pas ici.Il est important de garder à l'esprit car ces autres caractères ne font pas partie de la façon dont les données sont encodées.
bethlakshmi
2011-05-20 22:47:36 UTC
view on stackexchange narkive permalink

Cela dépend du format - certains protocoles de stockage de texte chiffré ont une partie en texte clair qui définit la manière dont il est chiffré. D'après votre exemple, je doute que la chaîne à laquelle vous faites référence est si courte qu'elle ressemble à du texte chiffré.

Je suggérerais quelques réflexions:

  • Le "==" à la fin serait certainement un remplissage, donc ne l'incluez pas dans les tentatives de déchiffrement.

  • Vous avez peut-être affaire à un hachage ou un hachage salé, plutôt qu'un cryptage. Dans ce cas, essayer de «déchiffrer» les données ne fonctionnera pas - vous devez faire correspondre les mots de passe en utilisant le même hachage et / ou la même valeur de sel que celui utilisé à l'origine. Il n'y a aucun moyen avec un mot de passe salé pour obtenir la valeur d'origine.

  • Votre meilleur pari absolu est d'obtenir une copie du code qui est utilisé pour stocker les mots de passe. Quelque part là-dedans, les mots de passe subissent une opération cryptographique. Trouvez le code pour savoir ce qui se passe ici. 9 fois sur 10, ils utilisent une sorte d'API pour le hachage / salage / cryptage et vous pouvez l'imiter ou l'inverser en utilisant la même API.

Le `==` à la fin est un signe révélateur de la valeur encodée en base64. Le rembourrage est nécessaire; vous ne faites pas que * le laisser * tomber. D'abord, vous décodez les données en base64, PUIS jouez avec.
Vous pouvez couper le remplissage en étant capable de le calculer par longueur de message. Pour utiliser base64 dans une chaîne de requêtes, vous devez pratiquement le passer par une transformation webSafeBase64, puis inverser le processus avant le décodage.
Jeff Ferland
2011-05-23 20:17:42 UTC
view on stackexchange narkive permalink

Le codage peut généralement être deviné à. Par exemple, la chaîne que vous avez publiée dans votre question est encodée en Base64. Les signes égal sont remplis dans le schéma Base64. C'est quelque chose que je sais de vue par expérience.

Si vous m'avez donné une chaîne qui a été chiffrée, je pourrais peut-être vous dire l'encodage, mais je ne peux pas vous dire l'algorithme utilisé pour le chiffrer à moins une sorte de métadonnées est disponible. La raison est la suivante: les algorithmes de chiffrement fonctionnent en produisant ce qui semble être des données aléatoires. Si je chiffrais deux phrases chacune avec deux chiffrements (quatre sorties), vous seriez incapable de me dire avec certitude quel texte chiffré appartenait à quel chiffrement, sauf si vous l'avez déchiffré ou cassé le chiffrement.

En ce qui concerne votre instance spécifique, les mots de passe sont généralement hachés. Cela signifie que vous ne pouvez pas récupérer le mot de passe à partir du hachage, mais vous pouvez tester pour voir si le hachage correspond au mot de passe. À cet égard, la réponse de @ john est en or. Si vous pouvez saisir un mot de passe que vous connaissez et ensuite essayer des schémas courants contre lui, vous pouvez découvrir quel est le hachage utilisé.

Ilmari Karonen
2011-10-20 16:23:25 UTC
view on stackexchange narkive permalink

S'il s'agit effectivement d'un simple hachage de mot de passe, nous pourrions peut-être utiliser Google pour le déchiffrer. Cependant, Base64 est difficile à rechercher, avec toutes ces barres obliques et signes plus, alors convertissons d'abord ce hachage en hexadécimal:

  $ perl -MMIME :: Base64 -le 'print unpack "H * ", decode_base64" WeJcFMQ / 8 + 8QJ / w0hHh + 0g == "'59e25c14c43ff3ef1027fc3484787ed2  

OK, maintenant nous pouvons Google pour cela. Pour le moment, je reçois un seul appel, de md5this.com - bien qu'il y en ait évidemment assez bientôt, y compris ce message.

Malheureusement (ou peut-être heureusement, selon votre point de vue), nous n'avons pas la chance de trouver une pré-image (le site répertorie actuellement ce hachage comme "cracking ..."), mais le fait qu'il soit sur cette liste du tout suggère fortement qu'il s'agit bien d'un hachage MD5 non salé d'un vrai mot de passe.

Très intéressant comment Google peut aider dans cette situation.Bonne part!
Nam Nguyen
2011-05-20 18:01:55 UTC
view on stackexchange narkive permalink

Le seul moyen est de deviner. Avec l'expérience, les travaux de supposition seront plus corrects.

Par exemple: Basé sur la longueur de la sortie: la sortie MD5 est de 128 bits, ou 16 octets, la sortie SHA1 est de 160 bits, ou 20 octets. Basé sur le jeu de caractères de la sortie: BASE64 produit une sortie avec des caractères imprimables.

À la fin de la journée, c'est l'approche try-and-error qui vous apprend comment.

user185
2011-05-20 18:26:47 UTC
view on stackexchange narkive permalink

Le seul moyen est lorsqu'il y a des métadonnées qui vous le disent. Par exemple, j'ai travaillé avec des PDF récemment, et le format comprend un dictionnaire contenant le filtre, l'algorithme, la taille de la clé, etc. Mais si tout ce que vous avez est le texte chiffré, alors tout ce que vous avez est une goutte opaque de données.

mti2935
2020-03-24 19:03:59 UTC
view on stackexchange narkive permalink

C'est une sécurité très faible sur tous les fronts! Le texte en clair est P4 $$ w0rdP4 $$ w0rd et il est chiffré à l'aide du chiffrement XOR, avec la clé CdZ4MLMPgYtAE9gQ80gMtg == . Cela produit le texte chiffré posté par l'OP ci-dessus, WeJcFMQ/8+8QJ/w0hHh+0g==

Pour vérifier:

D'abord, utilisez xxd pour obtenir le binaire sous-jacent du texte brut:

  echo -n 'P4 $$ w0rdP4 $$ w0rd' | xxd -b -c16  

Cela produit:

  01010000 00110100 00100100 00100100 01110111 00110000 01110010 01100100 01010000 00110100 00100100 00100100 01110111 00110000 01110010 01100100  

Ensuite, décode en base64 la clé et utilise xxd pour obtenir le binaire sous-jacent de la clé:

  echo -n 'CdZ4MLMPgYtAE9gQ80gMtg ==' | base64 -d | xxd -b -c16  

Cela produit:

  00001001 11010110 01111000 00110000 10110011 00001111 10000001 10001011 01000000 00010011 11011000 00010000 11110011 01001000 00001100 10110110  

Maintenant, XOR les deux chaînes binaires:

  01010000 00110100 00100100 00100100 01110111 00110000 01110010 01100100 01010000 00110100 00100100 00100100 01110111 00110000 01110010 01100100 (texte en clair) [XOR] 01110010 01100100 (texte en clair) [XOR] 01100001010101 10110011 00001111 10000001 10001011 01000000 00010011 11011000 00010000 11110011 01001000 00001100 10110110 (clé) ----------------------------------- -------------------------------------------------- -------------------------------------------------- -------- 01011001 11100010 01011100 00010100 11000100 00111111 11110011 11101111 00010000 00100111 11111100 00110100 10000100 01111000 01111110 11010010 (texte chiffré)  

Enfin, utilisez bc, xxd et base64 pour convertir le texte chiffré binaire en base64:

  echo "obase = 16; ibas e = 2; 01011001111000100101110000010100110001000011111111110011111011110001000000100111111111000011010010000100011110000111111011010010 "| bc | xxd -p -r | base64  

Cela produit WeJcFMQ / 8 + 8QJ / w0hHh + 0g == , qui est le texte chiffré posté par l'OP dans la question ci-dessus.


Je m'excuse si cette réponse semble artificielle. Certes, ça l'est. Des questions similaires à celle-ci, où l'affiche ne fournit que du texte chiffré et demande un aperçu de la manière dont ce texte chiffré aurait pu être produit, semblent être fréquemment posées sur security.stackexchange.com; et cette question est souvent citée comme un double de ceux-ci. Le but de cette réponse est d'illustrer que les questions de cette nature sont sans réponse, car il existe des solutions infinies à ces types de questions.

Attendez, alors avez-vous juste choisi un mot de passe, choisi une méthode de «hachage» (XOR), puis la force brute pour une clé qui a produit le texte chiffré donné?Votre dernière phrase est en or, mais je pense qu'il vaut peut-être la peine de souligner un peu plus.Quelqu'un qui n'y prête pas attention pourrait facilement partir en pensant que vous avez "résolu" le problème.
@Conor Mancone, Merci pour vos commentaires.Le cryptage XOR peut être `` rétro-ingénierie '', de sorte que si vous connaissez 2 des 3 variables (c'est-à-dire le texte en clair, la clé, le texte chiffré), vous pouvez facilement trouver la troisième.[Clé xor en clair = texte chiffré, Clé xor en texte chiffré = texte en clair, xor texte en clair = clé].Je viens de créer un texte en clair (P4 $$ w0rdP4 $$ w0rd), puis j'ai utilisé la troisième équation ci-dessus pour trouver la clé qui produirait le texte chiffré que l'OP a publié, étant donné le texte en clair que j'ai choisi.J'aurais pu choisir n'importe quel texte en clair.
Je me demandais si vous pouviez résoudre directement avec XOR.Je n'ai jamais joué avec les méthodes de cryptage en détail, donc je n'étais pas tout à fait sûr.Merci!


Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...