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

Salt?

.flumex

Neues Mitglied
Wunderschönen guten Abend, ich habe ein kleines Problem...
Ich habe ein Login/register ingamescript was mit Salt arbeitet.

Code:
function generateNewSalt ()
local pass = {}
local s = 10
local l = 20
        size = math.random(s,l) -- random password length
        for z = 1,size do
                case = math.random(1,2) -- randomly choose case (caps or lower)
                a = math.random(1,#char) -- randomly choose a character from the "char" array
                if case == 1 then
                        x=string.upper(char[a]) -- uppercase if case = 1
                elseif case == 2 then
                        x=string.lower(char[a]) -- lowercase if case = 2
                end
        table.insert(pass, x) -- add new index into array.
        end
        return(table.concat(pass)) -- concatenate all indicies of the "pass" array, then print out concatenation.
end

Code:
function saltPassword ( pname, string )

    local salt = MySQL_GetString("players", "Salt", "Name LIKE '" ..MySQL_Save(pname).."'")
    if salt == "" then
        salt = nC5PArDuHAQUnCr
        MySQL_SetString("players", "Salt", salt, "Name LIKE '" ..MySQL_Save(pname).."'")
    end
    return string..salt
end

Nun möchte ich das wenn ich mich auf der Website einlogge mit den gleichen Daten wie Ingame einloggen anmelden können und das kann ich nur wenn ich das Password wie das Login-Panel bekomme...
Nun hab ich mich dran versucht und ich bekomme es nur solange es nur in MD5 gehashed wird, und wenn Salt dann ins Spiel kommt, funktioniert es nicht mehr....

Das benutze ich:

PHP:
<?php
session_start();
include_once 'dbconnect.php';

if(isset($_SESSION['user'])!="")
{
    header("Location: home.php");
}

if(isset($_POST['btn-login']))
{
    $email = mysql_real_escape_string($_POST['email']);
    $upass = mysql_real_escape_string($_POST['pass']);
    $res=mysql_query("SELECT * FROM users WHERE email='$email'");
    $row=mysql_fetch_array($res);
   
      if($row['password']==md5($upass))
    {
        $_SESSION['user'] = $row['user_id'];
        header("Location: home.php");
    }
    else
    {
        ?>
        <script>alert('Login fehlgeschlagen!');</script>
        <?php
    }
}
?>

Brauche Hilfe. :/
 
Werbung:
Wenn der Benutzer einen Account anlegt:
- zufälliges Salz erzeugen
- PW mit dem Salz hashen
- Hash und Salz in DB schreiben
Wenn der Benutzer sich einloggt:
- Hash und Salz dieses Benutzers aus DB lesen
- eingegebenes PW und Salz hashen, mit Hash aus DB vergleichen

Nimm wenigstens sha1() und nicht md5(). Alle verwenden in ihren Beispielen immer dieses uralte md5, das längst nicht mehr sicher ist. Auch sha1 ist nicht das neueste und sicherste, besser ist crypt(), weil es erlaubt, den Zeitaufwand für das hashen abzustimmen.

Deine Salz-Erzeugung ist umständlich. Mach einfach einen Zufallsstring aus Ziffern und klein- und Goßbuchstaben mit fester Länge.
 
Werbung:
Und was grundsätzliches zum PHP-Code: mysql_* ist seit PHP 5.5.0 als veraltet markiert, und mit PHP 7 endgültig entfernt worden.

Verwende stattdessen MySQLi oder PDO.
 
Ich möchte bei der Gelegenheit eine Alternative zu Diskussion stellen, die ich mir überlegt habe:

Statt zufälliges Salz zu erzeugen und in der DB zu speichern, kann man doch den login-Namen des Benutzers mit hashen, zusammen mit konstantem Salz, das nicht vom Benutzer abhängt. Dadurch spart man Platz in der DB, denn den login-Namen muss man sowieso speichern. Das Verfahren sieht dann so aus:

Account anlegen:
- login-Namen (der sich von allen anderen unterscheiden sollte) zusammen mit dem PW hashen
- login-Namen und Hash in die DB schreiben
Einloggen:
- login-Namen und PW, die der Benutzer eingegeben hat, hashen (genau wie oben)
- prüfen, ob in der DB ein Eintrag mit diesem login-Namen und diesem Hash steht

Ich meine, das ist genauso sicher wie die Methode mit zufälligem Salz. Der Angreifer kann den offline-brute-force-Angriff nur durchführen, wenn es ihm gelingt, die Hashwerte aus der DB zu stehlen, und die "Salze" bekommt er damit auch gleich. Dann macht es keinen Unterschied mehr, ob er diese oder die Login-namen mit hashen muss.

Korrigiert mich, wenn ich etwas übersehen habe...
 
Werbung:
Zurück
Oben