Login mit Salt

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Login mit Salt

    Hallo,

    ich habe ein Registrierformular indem ein 64 Zeichen langer Salt generiert wird und dann mit sha256 Verschlüsselung in der Datenbank (Feld: userPasswordSalt) gespeichert wird, zusätlich zum dem sha256 verschlüsseltem Passwort (Feld: userPassword).

    Jetzt sitze ich gerade an dem Login und würde darum bitten, dass ihr euch das mal anschaut und sagt ob das ganze Sinn ergibt und was man verbessern kann. Ich hoffe ich habe das mit Salt alles richtig verstanden :)

    Hier der Code vom Login

    Gruß stedoo

    Quellcode

    1. <?php
    2. // Formularverabeitung
    3. // gesendetes Passwort verschlüsseln
    4. $sendPassword = hash('sha256',$_POST["password"]);
    5. // Eingabe reinigen
    6. $sendUsername = make_safe($_POST["username"]);
    7. $sendUsername = make_safe_sql($_POST["username"]);
    8. // Datenbank nach Ergebniss durchsuchen
    9. $sql_userLoginInfo = mysql_query("SELECT userID, userName, userFirstName, userLastName, userPassword, userFailedLogin FROM user_info WHERE userName='$sendUsername'");
    10. $sql_userLoginInfoCount = mysql_num_rows($sql_userLoginInfo);
    11. $row = mysql_fetch_object($sql_userLoginInfo);
    12. if($sql_userLoginInfoCount > 0) // Wenn Benutzer existiert
    13. {
    14. $sendPassword = make_safe($sendPassword);
    15. $sendPassword = make_safe_sql($sendPassword);
    16. $sendLoginPasswordHash = $sendPassword . $row->userPasswordSalt; // gesendetes Passwort salzen und verschlüsseln
    17. $userPasswordHash = $row->userPassword . $row->userPasswordSalt; // gespeichertes Passwort salzen und verschlüsseln
    18. if($row->userFailedLogin >= 3)
    19. {
    20. echo "<p class='error'>Du hast 3 mal das falsche Passwort eingegeben. Dein Account wurde aus Sicherheitgr&uuml;nden gesperrt.<br /> Bitte wende dich an den Administrator der Homepage.</p>";
    21. }
    22. elseif($sendLoginPasswordHash == $userPasswordHash)
    23. {
    24. $_SESSION["userID"] = $row->userID;
    25. $_SESSION["userLogin"] = true;
    26. $_SESSION['KCFINDER'] = array();
    27. $_SESSION['KCFINDER']['disabled'] = false;
    28. // Session ID erstellen
    29. $sessionID = uniqid();
    30. //Session ID verschlüsseln
    31. $sessionID_sha1 = sha1($sessionID);
    32. // Cookie setzen
    33. setcookie("activeSession","$sessionID_sha1",time()+$settings_sessionLifeTime); // 7200s = 2h
    34. //IP Adresse auslesen
    35. $ipAddress = getenv ("REMOTE_ADDR");
    36. // Sicherheit
    37. $userID = mysql_real_escape_string($row->userID);
    38. $sessionID2 = mysql_real_escape_string($sessionID_sha1);
    39. $ipAddress2 = mysql_real_escape_string($ipAddress);
    40. // Benuter Update
    41. mysql_query( "UPDATE user_info SET userOnlineStatus='1', userLastLogin='$currentDate', userSessionID='$sessionID2', userFailedLogin='0', userCurrentIP='$ipAddress2' WHERE userID='$userID'" );
    42. // Log Eintrag
    43. writeLog("login", "$username ($ipAddress2) hat sich angemeldet.");
    44. ?>
    45. <?php
    46. echo "<p class='success'>Du hast dich erfolgreich eingeloggt.<br /><a href='index.php?page=Startseite'>Falls die automatische Weiterleitung nicht funktioniert, klicken Sie bitte hier!</a></p>";
    47. echo"<meta http-equiv='refresh' content='3; URL=index.php?page=Startseite'>";
    48. }
    49. else
    50. {
    51. $ipAddress = getenv ("REMOTE_ADDR");
    52. $ipAddress5 = mysql_real_escape_string($ipAddress);
    53. echo "<p class='error'>Das eingegebene Passwort ist falsch.<br /><a href='index.php?page=Startseite'>Falls die automatische Weiterleitung nicht funktioniert, klicken Sie bitte hier!</a></p>";
    54. writeLog("failedLogin", "von IP Adresse: $ipAddress");
    55. mysql_query( "UPDATE user_info SET userFailedLogin=(userFailedLogin+1) WHERE userID='$userID'" );
    56. echo"<meta http-equiv='refresh' content='3; URL=index.php?page=Startseite'>";
    57. }
    58. }
    59. else
    60. {
    61. echo"<p class='error'>Benutzername konnte nicht gefunden werden.<br /><a href='index.php?page=Startseite'>Falls die automatische Weiterleitung nicht funktioniert, klicken Sie bitte hier!</a></p>";
    62. echo"<meta http-equiv='refresh' content='3; URL=index.php?page=Startseite'>";
    63. }
    64. ?>
    Alles anzeigen

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von stedoo ()

  • Moin stedoo!

    Bevor es um den Salt geht ... Warum veränderst du das Passwort mit make_safe() und make_safe_sql() ? Du hast doch beim Login nicht vor, dass Passwort in die Datenbank zu schreiben und auch beim Registrieren macht es keinen Sinn, da es sowieso gehashed wird.

    Beim Thema Salting und Hashing hat mir die folgende Seite sehr viel weitergeholfen: alias.io/2010/01/store-passwords-safely-with-php-and-mysql/ . Ich finde es dort sehr gut und verständlich erklärt. :)

    Kleiner Tipp am Rande: Die bcrypt Hash Funktion nimmt dir das ganze schön easy und sauber ab. bcrypt ist momentan eine der stärksten und am schwersten zu crackenden Hashing Methoden. Näheres z.B. hier: phpgangsta.de/schoener-hashen-mit-bcrypt

    Viel Erfolg und happy coding!
    Bodo_06
  • Danke Dir.
    Ich habe nun mal versucht mein Login umzubauen mit PDO. :)
    Ist das so alles in Ordnung oder muss ich noch was wichtiges beachten? Die PDO Klasse habe ich hier aus dem WIki (Danke dafür)



    Quellcode

    1. <?php
    2. // gesendetes Passwort verschlüsseln
    3. $sendPassword = hash('sha256',$_POST["password"]);
    4. $pdoparams = array(
    5. ':userName' => $_POST['username']
    6. );
    7. $sql = "SELECT
    8. userID,
    9. userPassword
    10. FROM
    11. user_info_page
    12. WHERE
    13. userName = :userName
    14. ";
    15. $stmt = MyDB::getInstance()->prepare($sql);
    16. $stmt->execute($pdoparams);
    17. $row = $stmt->fetch();
    18. if($stmt->rowCount() > 0) // Wenn Benutzer existiert
    19. {
    20. if($row->userFailedLogin >= 3)
    21. {
    22. echo "<p class='error'>Du hast 3 mal das falsche Passwort eingegeben. Dein Account wurde aus Sicherheitgr&uuml;nden gesperrt.<br /> Bitte wende dich an den Administrator der Homepage.</p>";
    23. }
    24. elseif($sendPassword == $row->userPassword)
    25. {
    26. // Sessions setzen -----
    27. $_SESSION["userID"] = $row->userID;
    28. $_SESSION["userLogin"] = true;
    29. //Session ID verschlüsseln -----
    30. $sessionID_sha1 = sha1(uniqid());
    31. // Cookie setzen -----
    32. setcookie("ActiveSession","$sessionID_sha1",time()+7200); // 7200s = 2h
    33. //IP Adresse auslesen
    34. $userCurrentIP = getenv ("REMOTE_ADDR");
    35. // Spielerinfo updaten -----
    36. $sql = "UPDATE
    37. user_info_page
    38. SET
    39. userOnlineStatus='1',
    40. userFailedLogin='0',
    41. userLastLogin=UNIX_TIMESTAMP(),
    42. userSessionID='$sessionID_sha1',
    43. userIPAddress='$userCurrentIP'
    44. WHERE
    45. userID='$row->userID'
    46. ";
    47. $stmt = MyDB::getInstance()->prepare($sql)->execute();
    48. // Meldung ausgeben -----
    49. echo "<p class='success'>Du hast dich erfolgreich eingeloggt.<br /><a href='index.php?page=Startseite'>Falls die automatische Weiterleitung nicht funktioniert, klicken Sie bitte hier!</a></p>";
    50. echo"<meta http-equiv='refresh' content='3; URL=index.php?page=Startseite'>";
    51. }
    52. else
    53. {
    54. echo "<p class='error'>Das eingegebene Passwort ist falsch.<br /><a href='index.php?page=Startseite'>Falls die automatische Weiterleitung nicht funktioniert, klicken Sie bitte hier!</a></p>";
    55. // Spielerinfo updaten -----
    56. $sql = "UPDATE
    57. user_info_page
    58. SET
    59. userFailedLogin=userFailedLogin+1
    60. WHERE
    61. userID='$row->userID'
    62. ";
    63. $stmt = MyDB::getInstance()->prepare($sql)->execute();
    64. echo"<meta http-equiv='refresh' content='3; URL=index.php?page=Startseite'>";
    65. }
    66. }
    67. else
    68. {
    69. echo"<p class='error'>Benutzername konnte nicht gefunden werden.<br /><a href='index.php?page=Startseite'>Falls die automatische Weiterleitung nicht funktioniert, klicken Sie bitte hier!</a></p>";
    70. echo"<meta http-equiv='refresh' content='3; URL=index.php?page=Startseite'>";
    71. }
    72. ?>
    Alles anzeigen