2010-11-30 7 views
6

Das ist ein Rätsel für mich und ich bin wirklich genervt, dass ich es nicht lösen kann! Also, wenn jemand etwas Freizeit hat, möchte ich hier einige Vorschläge machen, wie man es lösen kann!Ist diese Zeichenfolge Base64? Wie kann ich feststellen, welche Kodierung verwendet wird?

Ich benutze eine Software, die das Passwort in einer Oracle-Datenbank speichert. Das Passwortfeld ist vom Typ Varchar2 (100 Zeichen). Es scheint mir, dass die Software die Passwörter verschlüsselt und die codierte Zeichenfolge in der Datenbank speichert.

Mein Passwort ist '1234' und der codierte String ist 'cRDtpNCeBiql5KOQsKVyrA0sAiA ='. Alle Kennwörter in der Datenbank sind 28 Zeichen lang.

Das Puzzle, das ich mir selbst zugewiesen habe, ist die Codierung und/oder Verschlüsselung der Zeichenfolge zu finden. Meine erste Prüfung war auf Base64

So, hier ist mein erster Test in Python (Leerlauf):

>>> 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ᆲ 

,

Hier ist mein zweiter Versuch:

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

Also, mein Der erste Gedanke ist, dass dies nicht Base64-codiert ist. Nachdem ich wikipedia (https://en.wikipedia.org/wiki/Base64) überprüft habe, scheint es, dass Base64-codierte Strings nicht von fester Größe sind. Mein zweiter Gedanke ist, dass die Zeichenfolge verschlüsselt und dann in Base64 codiert wurde, und deshalb bekomme ich die seltsam aussehende decodierte Zeichenfolge.

Irgendwelche Ideen?

+0

könnte das die base64-Kodierung eines sha1-Hashs sein als 'len (base64.b16encode (base64.b64decode ('cRDtpNCeBiql5KOQsKVyrA0sAiA =')))' is '40'? –

+0

Ich frage mich, wie schwierig es wäre, den SHA1-Hash in das Passwort zu entschlüsseln (ok, es ist nicht wirklich entschlüsselt), da ich alle Einschränkungen kenne (minimale Länge, maximale Länge, Alpha, Großbuchstaben, Zahlen, Sonderzeichen usw.) ... Vielleicht sollte ich eine andere Frage stellen! :) –

+0

Dan Ich verstehe nicht, warum Sie b16encode verwenden, können Sie das erklären? –

Antwort

13

Es ist tatsächlich Base64-codiert. Es ist jedoch nicht das Passwort selbst, sondern sein SHA-1 Hash.

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

oder neuere Versionen von Python:

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

Base64 kodiert 3 Bytes als 4 Zeichen. Da Sie 27 Zeichen mit einer Auffüllung haben, können Sie sehen, dass es 20 kodierte Bytes gibt (27*3/4). Wenn etwas Sicherheitsbezogenes 20 Bytes (oder 160 Bits) lang ist, ist es normalerweise ein SHA-1. Wenn es 16 Bytes (128 Bits) ist, ist es normalerweise MD5.

BTW, es ist immer eine gute Idee, zufälliges Salz zu der Mischung hinzuzufügen, so dass zwei identische Passwörter nicht in der Datenbank herausragen würden. Unter Linux hilft Ihnen das crypt Modul dabei und führt noch ein paar Sicherheitsmaßnahmen ein.

Bearbeiten: um einen anderen Kommentar zu beantworten - es ist sehr einfach, das Original aus dem "verschlüsselten" Passwort zu erhalten.Es gibt eine Technik, die vor ein paar Jahren berühmt wurde Rainbow Tables genannt. Es gibt sogar online versions davon. Geben Sie einfach Ihren Hash in hex ein (7110eda4d09e062aa5e4a390b0a572ac0d2c0220) und Sie erhalten 1234 in einer Sekunde.

+2

Was die Frage aufwirft, welche unsichere Software Passwörter ohne * irgendein * Salz speichert? –

+0

'Import hashlib' wäre passender (' idle' beschwert sich, dass 'sha' veraltet ist). Ansonsten ist die Antwort ziemlich gut, danke! –

+0

Matthew, das System speichert Passwörter ohne Salz und Kickik das System läuft auf Linux. –

5

Während len(decoded) = 20 dann denke ich, dass dies Base64-codierten SHA1-Hash ist.

Sie können solche codierte Passwörter erstellen von:

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

Wie für eine solche Speicherung von Passwörtern: es ist nicht sehr gut, während viele Cracker „Regenbogen“ Tabellen mit vorberechneten MD5, SHA1 und andere Hashes und sie können verwenden können Passwort basierend auf einem solchen Hash erhalten. Um es zu verhindern, sollte "salt" verwendet werden: hash(salt+passwd), so kann Salz zufällige Zeichenfolge in der Datenbank pro Benutzer oder zum Beispiel Benutzeranmeldung (etwas, das nie geändert werden kann) gespeichert werden.

+1

nein wie MD5 wäre 16 Bytes lang, wie es 20 ist es ist sha1 –

+0

natürlich, danke, geändert –

+0

Michal, ist Ihre Antwort auch richtig. Danke für Ihre Hilfe! –

Verwandte Themen