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

Passwort sicher?

Ich habe nun also auch die Zeit aufbringen koennen um das Zeugs zu aendern.
Ich hoffe es stimmt nun. Es sieht jetzt so aus:

Der 1. Teil in index.php
PHP:
<?php
 include("test.php");
 if (isset($_POST["Passwort"])) {
  if ($_POST["Passwort"] == $Passwort) {
   $_SESSION[$Passwort] = true; // Session-Cookie setzen
   header("Location: home.php" ); // Weiterleitung
  }
 }
?>
2. Teil in home.php
PHP:
<?php
require_once 'test.php';
if(!isset($_SESSION[$Passwort]))
{
header('Location: http://osswald.li/index.php');
exit;
}
?>
3. Teil (kontrolle) test.php
PHP:
<?php
error_reporting(-1);
// Login
$Passwort = "mein Passwort"; // Passwort
@session_start();
?>
Vielen Dank fuers Durchschauen
LG Sunnyboy
 
Es gäbe noch eine Möglichkeit dein Script etwas sicherer zu machen.
Wenn jemand, egal auf welche art und weise, an deinen Quelltext kommt hätte er zugleich auch das Passwort also solltest du den Hash deines Passworts berechnen (PHP: md5 - Manual) und diesen anstelle des aktuellen Passworts in die Variable $Passwort einfügen. Danach gestaltest du den Passwort check folgendermaßen.

PHP:
if($Passwort == md5($_POST['passwort'])) {
    // richtiges passwort
}

lg
 
Besser noch mit einem Salt versehen (oder ein hinreichend kompliziertes Passwort wählen), denn für MD5 existieren mittlerweile sogar Lookup-Datenbanken (Rainbow Tables) im Web.

SALT = zufällige Bytefolge, etwa U(§T$2NF(Il
$Passwort = MD5-Hash von "echtespassword" plus SALT

PHP:
if($Passwort == md5($_POST['passwort'] . SALT)) {
    // richtiges passwort
}

- Message-Digest Algorithm 5

Statt MD5 könnte dann noch ein "sichererer" Algorithmus eingesetzt werden:

Code:
hash('sha512', $_POST['passwort'] . SALT)

- PHP: hash - Manual

Aber, na ja, wenn das ursprüngliche Passwort für eine Dictionary Attack anfällig ist, hilft auch das alles nur begrenzt.

- Dictionary attack - Wikipedia, the free encyclopedia
- Passwort

Fragt sich, wie praktisch relevant das jetzt für diesen Thread alles ist. ;)

Edit: Also, der Hinweis darauf, einen Hash zu speichern und nicht das Originalpasswort, ist schon gut. Und ich kann mir nicht vorstellen, dass jemand, der den Code in die Finger bekommt, wesentlichen Aufwand betreibt, den Hash anzugreifen. MD5+Salt müssten also auch bei simplen Passwörtern reichen. Theoretisch. *Wirklich sicher* bekommt man die Geschichte nur mit einem komplizierten Passwort und einem Hash-Algorithmus, der als "sicher" gilt. In dem Fall könnte man sich dann wiederum den Salt sparen.

- Salt (Kryptologie)
 
Zuletzt bearbeitet:
Ich habe mir die Dinge mal Angeschaut, verstehe sie aber nicht ganz.
Wenn ich mal angenommen die letzte Erklaerte Methode verwende, wie oder wo koennte ich dann das Passwort bestimmen?
Und wo muesste ich im Quelltext was einfuegen?

Hoffe auf Antwort
LG Sunnyboy
 
Statt MD5 könnte dann noch ein "sichererer" Algorithmus eingesetzt werden:

md5 reicht hier definitiv aus, du musst ja nur sicherstellen, dass man das Passwort nicht im Klartext bekommt.

Code:
hash('sha512', $_POST['passwort'] . SALT)
Das nutzen eines statischen salts ist sehr sinnvoll, schau dir aber auch mal dynamische salts an.

Du solltest mal prüfen wo deine sessions her kommen, es kann durchaus möglich sein, dass ein anderes Skript welches auf dem PHP Server läuft gültige Sessions im /tmp Ordner erzeugt, sollte dein Skript diese dann laden wäre dein Login unsicher. Sowas passiert in der Praxis zwar nicht oft, ist jedoch ein mögliches Risiko. Ich prüfe IMMER auch die Daten die in der Session sind auf Gültigkeit, erfordert leider etwas mehr Datenbankgedusel, ist jedoch deutlich sicherer. Alternativ kann man natürlich Nutzerdaten u.s.w. temporär auch auf einem memcached server unterbringen, bei größeren Projekten kann dies enorme Vorteile mit sich bringen.
 
md5 reicht hier definitiv aus, du musst ja nur sicherstellen, dass man das Passwort nicht im Klartext bekommt.

Der ungesalzene MD5-Hash eines einfachen Passworts (Größenordnung "apfel") ist -- wegen der erwähnten Rainbow Tables -- in Sekunden auflösbar. Auch für kompliziertere Fälle gilt MD5 in einem Szenario wie diesem (Hash bekannt, Salt bekannt) nicht mehr als sicher (siehe verlinkte Wikipedia-Seite).

(Dass ich nicht denke, dass sich jemand für eine private Seite unbedingt die Mühe macht, großartigen Aufwand zu betreiben, habe ich ja geschrieben.)

Das nutzen eines statischen salts ist sehr sinnvoll, schau dir aber auch mal dynamische salts an.

Ist hier nicht praktikabel (es gibt nur einen Nutzer), aber ein guter Hinweis für andere Anwendungen.
 
Zuletzt bearbeitet:
Und wie kann ich das Ganze nun im Quelltext einbauen?

Nur eine Idee vom ganzen waer super, da ich das System nicht verstehe.

LG Sunnyboy
 
Sunnyboy schrieb:
Und wie kann ich das Ganze nun im Quelltext einbauen?

Die Idee ist, nicht das Passwort in Reinschrift im Code zu speichern, sondern die Rückgabe einer Hashfunktion mit dem Passwort als Parameter. Jede Passwort-Eingabe während des Logins wird dann ebenfalls durch die Hashfunktion geschickt. Falls es sich bei der Eingabe um das Originalpasswort handelt, sind die Rückgabewerte gleich.

Der Rückgabewert der Hashfunktion lässt jedoch keine Rückschlüsse auf die entsprechende Eingabe zu. Das heißt, ich kann aus einem Hashwert nicht das Originalpasswort ermitteln. Wenn ich also den Hashwert kenne, weiß ich deshalb noch nicht, welches Passwort ich eintippen muss, um diesen Hashwert zu generieren.

Ein Beispiel für eine Hashfunktion:

PHP:
function myHashFunction($input)
{
    $salt = 'ZufälligeBytefolgezumSchutzvorRainbowTables!';

    return hash('sha512', $input . $salt);
}

Durch diese Hashfunktion schickst du nun einmal dein gewünschtes Passwort. Meinetwegen:

PHP:
echo myHashFunction('BesondersschönistdieiberischeHalbinselimFrühling.');

Das gibt dir je nach Hashfunktion eine mehr oder weniger lange Ausgabe. Bei sha512 ist es eine eher lange (512 Bit = 64 Byte). Ich füge sie hier nur abgeschnitten ein (Rückgabe in hexadezimaler Schreibweise):

Code:
1417fb...bcf07f

Das Originalpasswort kannst du jetzt sicher in deinem Kopf verstauen, für die Anwendung ist nur noch dieser Hashwert interessant. Diesen vergleichst du mit dem Rückgabewert der Hashfunktion für eine Passwort-Eingabe.

PHP:
if (isset($_POST['password'])) {
    if ('1417fb2...bcf07f' === myHashFunction($_POST['password'])) {
        echo 'Korrekt!';
    } else {
        echo 'Falsch!';
    }
}

Wenn ich als Angreifer jetzt diesen Code sehe, weiß ich noch immer nicht, was ich als Passwort eingeben muss, da ich keine Ahnung habe, welche Zeichenkette den entsprechenden Hashwert erzeugt.

* * *​

Der folgende Teil ist arg
1421-emot-pseudo.gif
(und für so ziemlich jeden privaten Anwendungsfall völlig unerheblich).

Das ist der Grund für die Nutzung von Salts, welches Hash verfahren hier genutzt wird ist bei deiner Aussage völlig egal.

Hier eine Diskussion auf Stack Overflow, die dieses Thema behandelt:

- Is MD5 really that bad? - Stack Overflow

Kurzversion: Was zum Knacken des Logins durchgeführt werden müsste, ist eine "first preimage attack". Der Angreifer kennt zu einem unbekannten Passwort P den Hash H(P) und sucht nun eine Eingabe P', für die gilt H(P) = H(P'). Ob P = P' gilt, ist dabei irrelevant. Auch der Salt ist, da dem Angreifer bekannt, zu vernachlässigen. Der Salt verhindert allerdings den Einsatz einer Rainbow Table. Das bedeutet, es müssen per brute force alle Möglichkeiten durchgegangen werden, bis ein P' gefunden wird, das die Bedingung erfüllt.

Diese Angriffsmethode ist prinzipiell für jeden hinreichend guten Hash-Algorithmus ineffizient. Das schließt auch MD5 ein. MD5 kann derzeit nicht effizient per preimage attack angegriffen werden.

Jedoch ist MD5 kollisionsanfällig. Das heißt, es lassen sich verhältnismäßig schnell (hier innerhalb von Minuten) zwei selbstgewählte Eingaben P und P' finden, die denselben Hashwert ergeben. Ob das die "Preimage-Sicherheit" beeinflusst, ist allerdings nicht bewiesen.

Es reicht jedoch aus, um alle Welt dazu zu bringen, vom Einsatz von MD5 abzuraten.

Auf Stack Overflow zitiert jemand das Fazit eines Artikels. Ein Ausschnitt daraus:

Even though MD5 might be safe under certain scenarios, unless you absolutely have to use it for reasons such as backwards compatibility or interoperability don’t. There is no point and as Schneier always says “Attacks never get worse, they only get better”.
 
Zurück
Oben