2010-11-30 41 views
6

Ceci est un puzzle pour moi et je suis vraiment agacé que je ne peux pas le résoudre! Donc, si quelqu'un a du temps libre, je voudrais ici quelques suggestions sur la façon de le résoudre! J'utilise un logiciel qui stocke le mot de passe dans une base de données Oracle. Le champ mot de passe est de type Varchar2 (100 caractères). Il me semble que le logiciel code les mots de passe et stocke la chaîne encodée dans la base de données.Est-ce que cette chaîne est Base64? Comment puis-je savoir quel est le codage utilisé?

Mon mot de passe est '1234' et la chaîne codée est 'cRDtpNCeBiql5KOQsKVyrA0sAiA ='. Tous les mots de passe de la base de données ont une longueur de 28 caractères.

Le puzzle que je me suis assigné est de trouver l'encodage et/ou le cryptage de la chaîne. Mon premier chèque était base64

Voici donc mon premier test en python (inactif):

>>> import base64 
>>> encoded = 'cRDtpNCeBiql5KOQsKVyrA0sAiA=' 
>>> decoded = base64.b64decode(encoded) 
>>> decoded 
'q\x10\xed\xa4\xd0\x9e\x06*\xa5\xe4\xa3\x90\xb0\xa5r\xac\r,\x02 ' 
>>> print decoded 
qíᄂО*ᆬ䣐ᄚᆬrᆲ 

,

Voici mon deuxième test:

>>> myString = '1234' 
>>> encoded = base64.b64encode(myString) 
>>> encoded 
'MTIzNA==' 
>>> decoded = base64.b64decode('MTIzNA==') 
>>> decoded 
'1234' 

Alors, mon La première pensée est que ce n'est pas codé en Base64. Après avoir vérifié wikipedia (https://en.wikipedia.org/wiki/Base64), il semble que les chaînes encodées en Base64 ne sont pas de taille fixe. Ma deuxième pensée est que la chaîne a été cryptée et ensuite encodée en Base64 et c'est pourquoi j'ai la chaîne décodée bizarre.

Des idées?

+0

pourrait être le codage base64 d'un hachage sha1 comme 'len (base64.b16encode (base64.b64decode ('cRDtpNCeBiql5KOQsKVyrA0sAiA =')))' est '40'? –

+0

Je me demande comment il serait difficile de déchiffrer (ok, ce n'est pas vraiment décrypter) le hachage SHA1 dans le mot de passe puisque je connais toutes les contraintes (longueur minimale, longueur maximale, alpha, majuscules, chiffres, caractères spéciaux etc ...) Peut-être que je devrais poser une autre question! :) –

+0

Dan Je ne comprends pas pourquoi vous utilisez b16encode, pouvez-vous expliquer? –

Répondre

13

Il s'agit en fait d'un encodage en Base64. Cependant, ce n'est pas le mot de passe lui-même qui est codé, mais son hachage SHA-1.

from sha import sha 
print 'cRDtpNCeBiql5KOQsKVyrA0sAiA='.decode('base64').encode('hex') 
print sha('1234').hexdigest() 

ou pour les nouvelles versions de Python:

from hashlib import sha1 
print 'cRDtpNCeBiql5KOQsKVyrA0sAiA='.decode('base64').encode('hex') 
print sha1('1234').hexdigest() 

base64 code 3 octets que 4 caractères. Comme vous avez 27 caractères avec un remplissage, vous pouvez voir qu'il y a 20 octets codés (27*3/4). Lorsque quelque chose de lié à la sécurité est de 20 octets (ou 160 bits), c'est généralement un SHA-1. Quand il s'agit de 16 octets (128 bits), c'est généralement MD5.

BTW, c'est toujours une bonne idée d'ajouter du sel aléatoire au mélange afin que deux mots de passe identiques ne ressortent pas dans la base de données. Sous Linux, le module crypt vous aide avec cela et ajoute quelques mesures de sécurité supplémentaires.

Modifier: pour répondre à un autre commentaire - il est très facile d'obtenir l'original du mot de passe "chiffré".Il y a une technique qui est devenue célèbre il y a quelques années et qui s'appelle Rainbow Tables. Il y a même online versions. Il suffit de taper votre hash en hexadécimal (7110eda4d09e062aa5e4a390b0a572ac0d2c0220) et il vous donnera 1234 en une seconde.

+2

Ce qui pose la question, quel logiciel non sécurisé stocke les mots de passe sans * aucun * sel? –

+0

'import hashlib' serait plus approprié (' idle' se plaint que 'sha' est déprécié). A part ça, la réponse est plutôt bonne, merci! –

+0

Matthew, le système stocke les mots de passe sans aucun sel et kickik le système fonctionne sur Linux. –

5

Alors len(decoded) = 20 alors je suppose que c'est un hachage SHA1 codé en Base64.

Vous pouvez créer ces mots de passe codés par:

import hashlib 
import base64 
passwd = '1234' 
hp = base64.b64encode(hashlib.sha1(passwd).digest()) 
print hp 
print len(hp) 

En ce qui concerne les mots de passe de stockage: il est pas très bon alors que de nombreux pétards peuvent utiliser des tables « arc-en- » avec MD5 précalculé, SHA1 et autres hash et ils peuvent obtenir un mot de passe basé sur un tel hachage. Pour éviter cela "sel" doit être utilisé: hash(salt+passwd), ce sel peut être une chaîne aléatoire enregistrée dans la base de données par utilisateur ou par exemple la connexion de l'utilisateur (quelque chose qui ne peut jamais être changé).

+1

non comme MD5 serait 16 octets de long, comme il est 20 c'est sha1 –

+0

bien sûr, merci, a changé –

+0

Michal, votre réponse est également correcte. Merci de votre aide! –