• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Passwort sicher verschlüsseln

  • Ersteller Ersteller DerMitSkill
  • Erstellt am Erstellt am
D

DerMitSkill

Guest
Hallo,
ich hab mir eine Klasse erstellt, mit der ich versuche, Passwörter sicher zu verschlüsseln.

PHP:
<?php

    class PasswortVerschluesseln {
        private $Benutzername, $Passwort, $PasswortVerschluesselt;
        public function setBenutzername($Wert) {
            $this->Benutzername = $Wert;
            return $this;
        }
        public function setPasswort($Wert) {
            $this->Passwort = $Wert;
            return $this;
        }
        public function doVerschluesseln() {
            $this->PasswortVerschluesselt = hash("sha256", $this->Passwort);
            hash("sha512", "blabla".$this->PasswortVerschluesselt.$this->Benutzername);
            return $this;
        }
    }

?>

Ist es Eurer Meinugn sicher? Was könnte ich noch tun?

Erklärung:
Das Passwort wird erst mit sha256 gehasht. Dann wird diesem Hash ein fester Salt vorne angehängt und der Benutzername dahinter und das ganze wird dann nochmal mit sha512 gehasht.

PS: ungetestet ^^
 
doppeltes hashen bringt nichts also kannst du auf den ersten schritt auch verzichten und strings die andere leute von außen lesen können wie z.b. den username da reinzupacken bringt auch nichts.

zudem gibts es keine sichere verschlüsselung und auch keine sicheres hash verfahren, alle kann man irgendwie knacken ;)

aber wenn du darauf achtest das man von außen nur bootstrap dateien sehen kann und keine anderen php dateien von außen zugänglich sind (also nicht alles in einen von außen zugänglichen ordner packen der heißt meist htdocs oder ähnlich) sollte ein fester salt mit einer größe von 50-100 (gerne mehr ;)) durchaus sicher genug sein um deinen ansprüchen zu genügen ;)

//Edit: ich werd hier gleich nochmal deine üerarbeitete klasse hinschreiben denn das was du da hast sieht nur aus wie oop ;)
 
strings die andere leute von außen lesen können wie z.b. den username da reinzupacken bringt auch nichts.

Ich kenn mich jetzt nicht so aus, aber zumindest das salzen (auch mit Benutzername) würde solche Methoden wie Rainbowtables doch verhindern, da nicht nur das Passwort in dem Hash steckt sondern auch etwas anderes!? Der Angreifer weiß auch nicht was...
 
ganz einfach, ein username ist etwas das jeder sehen kann also packen wir das nicht in unser passwort... ein salt ist etwas unbekanntes das NIEMAND kennt ;)
mag keine dolle erklärung sein aber du kannst mir einfach mal glauben ;)

ach und hier die von mir überarbeitete klasse

PHP:
<?php

class Password {
	private $pass;
	private $hash;
	
	public function __construct($pass = null) {
		$this->setPassword($pass);
	}
	
	public function setPassword($pass) {
		$this->pass = $pass;
	}
	
	public function getHash() {
		if(is_null($this->pass)) {
			throw new Exception('You have to set a password bevore you can get the hash!');
		}
		return $this->hash;
	}
	
	public function __toString() {
		return $this->getHash();
	}
	
	private function calculateHash() {
		$this->hash = hash("sha512", $this->pass . $this->getSalt());
	}
	
	private function getSalt() {
		/**
		 * diese methode solte den salt zurückgeben
		 * wie DU das letztendlich machst sei dir überlassen ^^
		 * 
		 * ich machs erstmal so ;)
		 */
		
		return '$/(§N%U56I%/(BIKLKjzu()HG%/EHIJ/(R%&)J&((&7987689$/%/'.
		       '$45§(3468956§$/&346490F%/wC%ug%&(§VJ35h§VJ&E5j7§/%§Uj'.
		       'vbB&(j/O$D&3g57bu6V&%(Mnbu6%/)=k57J=5789J)8gF/zN&$2n8'.
		       '8u46M/4GZ35P=5Jh86G7f&D"§$j68)$Kj68Hif4zu/§$&3h9Hg%72';
	}
}

die kannst du wunderbar ganz einfach so benutzen

PHP:
$pass = 'klaus';

$hash = new Password( $pass );

echo $hash->getHash();

$hash->serPassword('peter');

// funktioniert auch dank der __toString methode die ist was besonderes solltest mal googeln ;)
echo $hash;

ich habe die klasse jetzt ziemlich einfach gehalten, man könnte es mit ein wenig abstraktion noch weiter treiben aber das währe wohl zu viel für einen unerfahrenen ^^
 
Mhhh.... bist in PHP schlau? :lol: Ich denke mal ja, gell? ^^

1. Die Funktion getSalt() wird benutzt, bevor sie erstellt wurde, muss das nicht alles der Reihenfolge nach sein?

2. Wann setzt man oben z.B. private $pass; und private $hash;, also diese Variablen mit private davor? Ich habs immer für alle Variablen gemacht, aber das ist ja wohl falsch ^^

3. Was ist __construct? Auch durch googlen hab ichs noch nicht kapiert...
 
1. nein, da php eine scriptsprache ist wird erst alles geladen und dann erst ausgeführt ;)

2. private schreibe ich davor damit man nicht von außen drauf zugreifen kann

PHP:
$a = new Password;
$a->pass;

das geht so nicht, allerdings kann auch keine andere klasse drauf zugreifen also würde z.b.

PHP:
class a extends Password {
    public function __construct() {
        echo $this->pass;
    }
}

new a;

würde also auch nicht gehen, damit das geht müsste ich schreiben

PHP:
// ...
protected $pass;
// ...

und damit man auch von außen drauf zugreifen kann also das beispiel mit dem $a->pass; müsste man schreiben

PHP:
// ...
public $pass;
// ...

3. __construct ist, wenn definiert, die methode die angesprochen wird wenn man schreibt

PHP:
new Password;

kannst du an diesem beispiel wunderbar sehen

PHP:
class test {
	public function __construct() {
		echo "ich werde direkt nach dem start aufgerufen<br />";
	}
	
	public function sayHello() {
		echo "Hallo Welt!";
	}
}

$a = new Test;

// die nächste zeile einfach auskommentieren nach deinem ersten versuch mit dieser datei ^^
// $a->sayHello();

dazu hier noch nen link ^^

PHP: Magische Methoden - Manual
 
ich würde jetzt einmal als nicht ganz so wissender sagen, um die rainbow tables zu umgehen sollte man das passwort noch salzen, vorn und hinten (Add:Warum nicht noch jedem 2. zeichen noch salzen?), und um die erstellung von rainbow tables zu erschweren, am besten noch username und email hinzufügen, vlt auch das passwort 2x. eine langsame Edit:hashfunktion benutzen, die länger auf systemen benötigt: crypt().
 
Zuletzt bearbeitet:
Sicher nicht verkehrt, aber zumindest ein Salt wurde bereits im Eröffnungsbeitrag erwähnt/implementiert.

Achte außerdem bitte auf das Alter der Threads. Dieser nähert sich langsam aber sicher seinem dritten Geburtstag.

Allgemein: Ein Hash ist keine Verschlüsselung.
 
Ja, keine Verschlüsselung. Hm… eine Ein-Wege-Verschlüsselung ist wie ich finde doch ein guter Ausdruck, um nicht näher eingeweihten den Sinn eines solchen näherzubringen.

Salten vorne und hinten ist gut und mehrfaches Hashen ist (im Gegensatz zu dem was vorher gesagt wurde) auch sinnvoll, denn das erschwert Bruteforce-Attacken (schlicht und einfach, weil es dann länger dauert).
 
Eine Hash-Funktion arbeitet nach diesem Schema:

PHP:
<?php

/**
 * Algorithmus: Liefert das erste und letzte Byte der Eingabe. Bei Eingaben
 * kürzer als 2 Byte wird für fehlende Bytes ein 'x' ergänzt.
 *
 * @param string $input
 * @return string
 * @throws Exception
 */
function my_hash_func($input)
{
    if (!is_string($input)) {
        throw new Exception('$input must be a string');
    }

    $l = strlen($input);

    if ($l < 2) {
        $input .= str_repeat('x', 2 - $l);
    }

    return substr($input, 0, 1) . substr($input, -1, 1);
}

var_dump(
    my_hash_func('abcdefghijklmnopqrstuvwxyz'),
    my_hash_func('hallo welt'),
    my_hash_func(''),
    my_hash_func('a'),
    my_hash_func('az')
);

Zu einer Eingabe wird wiederholbar (deterministisch) ein „Prüfwert“ gebildet, aus dem die Eingabe in aller aller Regel nicht rekonstruierbar ist.

Verschlüsselung halte ich dabei für eine irreführende Vorstellung. Das ist einfach nicht das, was passiert.
 
Ja, ich weiß, was eine Hashfunktion macht. Naja, man verschlüsselt halt in eine Richtung. Aber ich habe mich schon mit anderen Leuten darum gekloppt und wir sind zu keinem Ergebnis gekommen. Von daher brauchen wir das hier nicht fortsetzen, es würde uns keinen Fortschritt bringen. ;-) Sagen wir einfach es gehört zur Kryptographie. ;-)
 
Naja, man verschlüsselt halt in eine Richtung.

Nein, man bildet einen Hash-Wert.

Es gibt keinen Schlüssel, es ist keine Entschlüsselung möglich und die Originalinformationen gehen verloren.

Da ist die Anwendung einer Funktion wie strrev noch eher eine Verschlüsselung (umkehrbar, kein Informationsverlust). Auch ein Pack-Algorithmus wie Zip hat mehr von einer Verschlüsselung.

Beides würde aber wohl niemand als Verschlüsselung bezeichnen. Warum also gerade das Hashing?

Wahrscheinlich, weil Hashing von den meisten Leuten bewusst nur im Zusammenhang mit Passwörtern eingesetzt wird und weil Passwörter kurz genug sind, dass der Hash ungefähr dieselbe Länge hat, sodass es nach Verschlüsselung aussieht.

Eine 2 GB große Datei würde aber auf die gleichen 128 Bit reduziert.

Wenn du so willst, bildet eine Funktion wie strlen einen Hash-Wert einer Eingabe. Ist das eine Verschlüsselung?

Da musst du die Definition schon so weit fassen, dass du jeden abgeleiteten Wert eines Strings oder einer Eingabe (Länge, Anzahl Vokale, das erste Zeichen) als Verschlüsselung des Inhalts auffasst.

Aber auf die Weise lässt sich praktisch alles begründen. Dann ist MD5 auch ein einseitiges Komprimierungsverfahren mit einer extrem hohen Effizienz bei großen Dateien.


Noch mal kurz umgekehrt: Hashing wird in vielen Fällen dazu genutzt, eine Prüfsumme zu bilden. Wenn du sicherstellen willst, dass du ein Verzeichnis komplett von USB-Stick auf Festplatte kopiert hast, guckst du zum Beispiel, ob die Größe und die Anzahl der Dateien identisch sind. Das ist auch eine Prüfsumme, die du leicht vergleichen kannst, ohne jede Datei einzeln durchzugehen (→ Effizienz). Ein Verfahren wie MD5 leistet im Grunde dasselbe.
 
Noch einmal: Ich weiß, was man macht. Und eine 2GB große Datei wird (kollisionsfreier Algorithmus und Verträglichkeit dieser Dateigröße vorausgesetzt) nicht auf die gleichen 128 Bit reduziert. ;-) Aber das war wohl nur schlecht formuliert von dir. Mir ging es ja auch nur darum, es einem unbedarften Nutzer näher zu bringen. Ich würde auch nicht sagen: Hashing ist Verschlüsselung (wieso nennt man es dann Hashing und nicht direkt so), sondern Hashing kann zu einer Art von Passwortverschlüsselung genutzt werden. Dass das nicht 100% richtig ist, ist mir bewusst. Um es einem unbedarften (Nichtinformatiker) zu erklären, würde es mir reichen. Mehr sagte ich nicht oder wollte ich nicht sagen.

Wie gesagt: Streiten wir uns nicht. Mir kommt es nur manchmal so vor, als seien manche Leute nicht dazu bereit Sachen herunterzubrechen, damit sie verständlicher werden. Dass man dabei bestimmte Aspekte außer acht lassen muss, ist ja unbestritten.
 
Zurück
Oben