Schrift
[thread]12730[/thread]

perl md5 subroutine (Seite 2)



<< |< 1 2 3 >| >> 24 Einträge, 3 Seiten
topeg
 2008-11-07 21:15
#116076 #116076
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Also zu Anfang, weißt du was eine MD5-Summe darstellt? Wenn ja diesen Abschnitt überspringen.

Eine MD5-Summe ist eine Zeichenkette, die einen String eindeutig identifiziert. Bei der Entwicklung war es das Ziel, dass an damit jeden beliebigen String, eindeutig einer MD5-Summe zuordnen zu können. (was auch funktioniert, nur bei sehr großen Strings ist die Zuordnung nicht mehr eindeutig)
Zudem ist die Methode nicht umkehrbar. Man kann aus einem String immer die gleiche MD5-Summe generieren, aber es ist unmöglich aus einer MD5-Summe den String zu erzeugen, mit dem die Summe Erzeugt wurde. Ein erwünschter Effekt bei dem Algorithmus ist, das schon eine minimale Änderung am UrsprungsString eine völlig andere MD5-Summe erzeugt.

Dein kleines Code Schnipplechen dokumentiert:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# Laden des Moduls "Digest::MD5"
# bedenke, das das "::" eine Pfadangabe sein kann und im dem meisten fällen auch ist.
# das Modul befindet sich also ungefähr hier:
# /usr/lib/perl/5.10/Digest/MD5.pm
# alles vor "Digest" kann variieren, je nach Betriebssystem/Distribution oder Art der Installation.
# das ".pm" identifiziert es als PerlModul
use Digest::MD5;

# Zuweisung zweier Variablen
# denke dringend darüber nach die Module
# "strict" und "warnings"
# zu verwenden, da sie dir helfen Fehler in Scripten zu zu finden
# zwar zwingen sie dich ein "exakteres" Perl zu schreiben,
# dafür findest du Fehler, (z.B Schreibfehler) viel leichter
$pass= "geheimesPasswort";
$nick= "Ichbins";

# das Erzeugt ein Objekt, aus der Klasse "Digest::MD5",
# welches auch das  Modul ist.
# Dabei werden im Objekt einige Variablen erzeugt
# und auf einen definierten Wert gesetzt.
# unter anderem auch eine Variable,
# die den zu hashenden String aufnehmen wird.
$md5 = Digest::MD5->new;

# Das fügt der Variable im Objekt (die oben im Objekt als leerer String initialisiert wurde)
# den String "Ichbins\x000geheimesPasswort" hinzu
# das ist gleich bedeutend zu:
# $md5 -> add($nick);
# $md5 -> add("\0");
# $md5 -> add($pass);
# oder
# $md5 -> add("Ichbins");
# $md5 -> add("\0");
# $md5 -> add("geheimesPasswort");
# Das "\0" würde binär als "00000000" dargestellt
# Das "I" z.B. würde binär als "01001001" dargestellt
$md5 -> add("$nick\0$pass");

# die MD5-Summe erzeugen
# und als Hexadezimal Kodierter String in "$digest" schreiben
$digest = $md5->hexdigest;


Ich hoffe dir ist das jetzt etwas klarer, was da passiert.
Gast Gast
 2008-11-07 21:19
#116077 #116077
nee jaa

erstmal großes Danke für deine Hilfe.



ich habs jetzt kapiert und es funktioniert bestens ohne NullByte.

jippi

mit nullbyte gelingt es mir allerdings nicht es nachzubauen

welches Zeichen erzeugt das nullbyte denn zwischen $nick und $pass wenn es vom string abgearbeitet wird??

irgend ein Zeichen muss es ja erzeugen sonst wäre ja der hash identisch mit dem ohne nullbyte

mein Problem ist wohl grundlegend das nullbyte, es muss doch wenn die Zeile abgearbeitet wird und der md5 Routine wie du so passend sagtest "zum frass vorgeworfen wird" irgend ein char zwischen $nick und $pass stehen sonst würde es ja keinen Unterschied machen ob nullbyte oder nicht

John
topeg
 2008-11-07 21:37
#116078 #116078
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Gast+2008-11-07 20:19:07--
mit nullbyte gelingt es mir allerdings nicht es nachzubauen

welches Zeichen erzeugt das nullbyte denn zwischen $nick und $pass wenn es vom string abgearbeitet wird??


Es gibt in Perl mehrere Möglichkeiten ein Nullbyte zu erzeugen.
Aber die einfachste Variante ist wohl:
Code (perl): (dl )
$nulbyte="\0"

Das "\" vor der Null sagt perl, dass das nachfolgende Zeichen eine besondere Bedeutung hat. In diesem Fall wird von perl die Null als Befehl ein Nullbyte zu erzeugen erkannt.
Code (perl): (dl )
$nulbyte="\x00"

Das "x" sagt perl, dass die beiden nachfolgen Zeichen als Hexadezimaler Wert binär dargestellt werden sollen. Bei "00" ist das halt das Nullbyte.
Anzumerken wäre, das diese ZeichenInterpretation nur bei Doublequotes (") funktiniert bei Singlequotes (') wird dar String genommen wie er da steht. (mit einer Ausnahme, aber das solltest du selber nachlesen)

Daneben gibt es noch weitere Möglichkeiten, z.B. mit pack, die ich aber nicht aufführen will, da das sonst in eine Einführung in perl ausarten würde und dazu gibt es einige Tutorials, die das besser können als ich.

Aber zeig mal was du geschrieben hast. Dann können wir dir sagen, warum es nicht funktioniert. Ohne etwas Code können wir nur raten.
Gast Gast
 2008-11-07 21:58
#116079 #116079
Danke topeg für deine Ausführungen.

Nein es geht mir hier strikt um diesen Fall und es handelt sich um Doublequotes.

also der hash den der String ausspuckt ist
Code: (dl )
5c4b9e0bf6092b291ddb71c77c016392


wenn ich nun teste

Code: (dl )
Ichbins\x000geheimesPasswort 


kommt

Code: (dl )
192bb26532e29d7e06df57f35ef0496c
raus

Code: (dl )
Ichbins00000000geheimesPasswort 


erzeugt

Code: (dl )
48d9162850e83193d2dd42d0cca64521


und
Code: (dl )
Ichbins\00geheimesPasswort 


wird zu
Code: (dl )
a434250cef9e8ab12eced596086b363e


Das passt doch aber alles nicht zu dem von den String erzeugten hash

5c4b9e0bf6092b291ddb71c77c016392


also entweder ist mein hashcalculator kaputt, oder ich kapier nicht welches Zeichen (oder welche Zeichen) das Nullbyte zwischen den Variablen erzeugt.

John

Linuxer
 2008-11-07 22:20
#116080 #116080
User since
2006-01-27
3882 Artikel
HausmeisterIn

user image
Gast+2008-11-07 20:58:41--
...
oder ich kapier nicht welches Zeichen (oder welche Zeichen) das Nullbyte zwischen den Variablen erzeugt.


Sorry, ich verstehe nicht, was an topegs Antwort so unverständlich ist:

topeg+2008-11-07 20:37:42--
Aber die einfachste Variante ist wohl:
Code (perl): (dl )
$nulbyte="\0"

Das "\" vor der Null sagt perl, dass das nachfolgende Zeichen eine besondere Bedeutung hat. In diesem Fall wird von perl die Null als Befehl ein Nullbyte zu erzeugen erkannt.
Code (perl): (dl )
$nulbyte="\x00"

Das "x" sagt perl, dass die beiden nachfolgen Zeichen als Hexadezimaler Wert binär dargestellt werden sollen. Bei "00" ist das halt das Nullbyte.


Also:
Code (perl): (dl )
1
2
3
4
5
my $nick = "adam";
my $pass = "eva";
my $string = "$nick\0$pass";
# oder
my $string2 = "$nick\x00$pass";


Sorry, dass ich Dein Nichtverstehen nicht verstehe...


meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
topeg
 2008-11-07 22:47
#116082 #116082
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Gast+2008-11-07 20:58:41--
Code: (dl )
Ichbins\x000geheimesPasswort 

Mach mal ein
Code (perl): (dl )
print "\x000"
dabei kommt raus "0".
Du hast da eine "0" zu viel. (das Nullbyte ist unsichtbar, da es nicht darstellbar ist)
Korrekt wäre "\x00"

Gast+2008-11-07 20:58:41--
Code: (dl )
Ichbins00000000geheimesPasswort 

"00000000" ist kein Nullbyte sondern nur acht Nullen (der Binärwert von "0" ist übrigens "00110000")

Gast+2008-11-07 20:58:41--
Code: (dl )
Ichbins\00geheimesPasswort 

Das ist ein korrektes Nullbyte. Das ist gleichbedeutend mit "\0" oder "\000" oder "\x00"

Gast+2008-11-07 20:58:41--
Das passt doch aber alles nicht zu dem von den String erzeugten hash
5c4b9e0bf6092b291ddb71c77c016392

Welchen "den String" meinst du?
topeg
 2008-11-07 23:09
#116084 #116084
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Möglicherweise rührt dein Problem daher, zu verstehen, als was der md5 Algorithmus dein String sieht.
Der Algrorithmus (und auch perl) sieht nur eine Abfolge von Bits
Nehmen wir mal deinen String:
Code: (dl )
Ichbins\00geheimesPasswort 

ist binär Dargestellt (Punkte von mir):
Code: (dl )
01001001.01100011.01101000.01100010.01101001.01101110.01110011.00000000.01100111.01100101.01101000.01100101.01101001.01101101.01100101.01110011.01010000.01100001.01110011.01110011.01110111.01101111.01110010.01110100

Oder besser zu lesen hexadezimal(Punkte von mir):
Code: (dl )
49.63.68.62.69.6e.73.00.67.65.68.65.69.6d.65.73.50.61.73.73.77.6f.72.74

Oder Dezimal(wieder die Punkte von mir):
Code: (dl )
73.99.104.98.105.110.115.0.103.101.104.101.105.109.101.115.80.97.115.115.119.111.114.116

Alle Zeichen, die du auf dem Monitor sehen kannst sind im Speicher nur Binäre Muster, die der Computer mit der Richtigen Software als Buchstaben, Zahlen, Satzzeichen usw. darstellt.

Du kannst also nicht zwei unterschiedliche Sachen schreiben und glauben es wäre gleich weil es ähnlich aussieht. für den Computer (und auch MD5) sind sie völlig unterschiedlich.
Nun will dir perl helfen und interpretiert bestimmte Zeichenfolgen als das selbe Binäre Muster, aber das unterliegt festen Regeln, die du lernen musst.


Auch wenn der Spruch abgedroschen ist:
Ein Computer ist dumm, extrem dumm, aber willig.
Er macht genau das wass du ihm sagst, aber nicht umbedingt das was du von im willst.
topeg
 2008-11-07 23:28
#116085 #116085
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Ach so noch was:
Du sprichst immer davon dass du es testest, aber nicht wie du es testest.

Ich habe meine eigenen Tests gemacht:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#!/usr/bin/perl
use strict;
use warnings;
use Digest::MD5;

my $pass= "geheimesPasswort";
my $nick= "Ichbins";

my $md5 = Digest::MD5->new;
$md5 -> add("$nick\0$pass");
my $digest = $md5->hexdigest;
print "Digest is $digest\n";

$md5 = Digest::MD5->new;
$md5 -> add("Ichbins\0geheimesPasswort");
$digest = $md5->hexdigest;
print "Digest is $digest\n";

$md5 = Digest::MD5->new;
$md5 -> add($nick);
$md5 -> add("\0");
$md5 -> add($pass);
$digest = $md5->hexdigest;
print "Digest is $digest\n";

$md5 = Digest::MD5->new;
$md5 -> add("$nick\00$pass");
$digest = $md5->hexdigest;
print "Digest is $digest\n";

$md5 = Digest::MD5->new;
$md5 -> add("Ichbins\00geheimesPasswort");
$digest = $md5->hexdigest;
print "Digest is $digest\n";

$md5 = Digest::MD5->new;
$md5 -> add("$nick\x00$pass");
$digest = $md5->hexdigest;
print "Digest is $digest\n";

$md5 = Digest::MD5->new;
$md5 -> add("Ichbins\x00geheimesPasswort");
$digest = $md5->hexdigest;
print "Digest is $digest\n";
und das kam dabei raus:
Code: (dl )
1
2
3
4
5
6
7
Digest is 5c4b9e0bf6092b291ddb71c77c016392
Digest is 5c4b9e0bf6092b291ddb71c77c016392
Digest is 5c4b9e0bf6092b291ddb71c77c016392
Digest is 5c4b9e0bf6092b291ddb71c77c016392
Digest is 5c4b9e0bf6092b291ddb71c77c016392
Digest is 5c4b9e0bf6092b291ddb71c77c016392
Digest is 5c4b9e0bf6092b291ddb71c77c016392
topeg
 2008-11-07 23:44
#116086 #116086
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Zeig mal wirklich deinen Code.
Bei dem stimmt irgend was nicht, denn ich bekomme bei deinen Beispielen andere Summen raus als du.
Gast Gast
 2008-11-07 23:49
#116087 #116087
nee ich habs jetzt kapiert :-)

Danke Jungs, bin halt ein recht schwerer Fall

John
<< |< 1 2 3 >| >> 24 Einträge, 3 Seiten



View all threads created 2008-11-07 15:09.