Warum gibt PHP bei ein und demselben Passwort unterschiedliche Hashes zurück?

5 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Der Hash ist "gesalzen" (randomisiert), um Angriffe mittels so genannter Rainbow-Tables zu vereiteln.

Ein Passwort zu einem späteren Zeitpunkt noch einmal zu hashen und die Hashwerte zu vergleichen, funktioniert daher nicht.

Um anhand eines gespeicherten Hashwerts zu einem späteren Zeitpunkt zu prüfen, ob ein vom Benutzer übermitteltes Passwort korrekt ist, nutzt Du die Funktion password_verify(...). Dieser übergibst Du den Hashwert und das zu überprüfende Passwort und sie sagt Dir dann, ob das Passwort, das Du übergeben hast, zum Hashwert passt.

Einwandfrei, jetzt läufst. Musste PASSWORD_DEFAULT noch zu PASSWORD_BCRYPT ändern. Danke!

1

Wie aus dem Lehrbuch!

2

Du ersetzt ein gesalzenen Hash, der einen randomisierten Teilstring enthält.

Daher kann der Hashwert bei gleichem Passwort nicht identisch sein, das ist genau Sinn und Zweck der Übung.

Es ist also kein Problem, sondern gewolltes Verhalten.

Ich persönlich bevorzuge crypt(), da es mir mehr Möglichkeiten udn höhere Kompatibilität bietet.

password_hash() erfordert auch noch eine Angabe zur Algorithmus, die Info fehlt in deiner Fragestellung. Zeig deinen Quellcode um dir die Frage beantworten lassen zu können.

Außerdem würde ich empfehlen Passwort-Vergleiche in der Datenbank selbst vorzunehmen. Das Passwort sollte natürlich schon mit PASSWORD() in der Tabelle gespeichert werden, mit einem Statement kannst Du dann prüfe, ob es stimmt oder nicht. Das erspart dann jegliche PHP-Operation dazu.

empfehle ich überhaupt nicht , den die vorgaben von der Datenbank sind bescheiden und auch bei Updates etc ein riesen Problem . Portabel ist das ganze auch nicht.

0

MariaDB,PHP: Kann nicht von anderem Rechner auf Datenbank zugreifen?

Hi, hab bei mir auf einem RBP ne MariaDB MYSQL Datenbank angelegt, (incl. phpmyadmin).

Habe in diesem Bereich noch kaum Erfahrung und ich habe das Problem dass ich von dem Webserver (steht im selben LAN) nicht auf die DB mit PHP verbinden kann.

Also wenn ich verbinden möchte von dem Webserver kommt Folgende Fehlermeldung:

SQLSTATE[HY000] [2002] Connection refused

Wenn ich das direkt auf dem DB-Server mit localhost versuche geht es.

Falls es noch hilfreich ist hier das Script mit dem ich verbinde:

<?php
$con=mysqli_connect("x.x.x.111","username","password","dbname");
if (mysqli_connect_errno())
{
echo "Failed to connect to MariaDB: " . mysqli_connect_error();
} else {
echo "JO ES GEHT";
}
 ?>

Und nochmal der Problem konkret: wenn ich das Script auf einem anderen Server im selben Neztwerk ausführe komme ich nicht drauf, mit localhost geht es.

...zur Frage

C# Hash Werte vergleichen?

Hallo, ich möchte bei einem Login das Passwort hashen. Wenn man sich eingeloggt hat, kann man neue Benutzer hinzufügen. DIe neuen Benutzer werden dann auch gehasht und beim einloggen soll geprüft werden, ob der Hash Wert vom hinzufügen des Benutzers mit dem Hash Wert beim einloggen übereinstimmt. Wie mache ich das? In meinem BenutzerDialog(dort werden die Benutzer erstellt) wird beim Erstellen_Clickeine Hush Methode aufgerufen.

public Benutzer _selectedBenutzer;

public void HashPassword() { PasswordWithSaltHasher pwHasher = new PasswordWithSaltHasher(); HashWithSaltResult hashResultSha512 = pwHasher.HashWithSalt("ultra_safe_P455w0rD", 64, SHA512.Create()); _selectedBenutzer.Passwort = hashResultSha512.Salt; _selectedBenutzer.Passwort = hashResultSha512.Digest; }

Wie vergleiche ich den Hash Wert vom Benutzer hinzufügen(BenutzerDialog) mit dem vom Login?

Will dann eine If-Anweisung in der Art schreiben(diese If-Anweisung ist dann im Login Button):

//If(hashwert == benutzerDialog.hashwert)
//{
//   MessageBox.Show("Die Hash Werte stimmen überein-");
//}
//else
//{
//   MessageBox.Show("DIe Hash Werte stimmen nicht überein");
//}
...zur Frage

C# User Login: Passwort-Hash vergleichen?

Hallo,

ich programmiere eine Anwendung, in der man Adressen mit SQL-Server verwalten kann. Man kann Benutzer anlegen und sich mit denen beim Start der Anwendung einloggen.

Nun möchte ich das Passwort hashen. Beim Erstellen des Benutzers wird bereits ein Hashwert generiert und in der Passwort-Spalte in der Datenbank angezeigt. Beim Einloggen soll auch das Passwort gehasht werden und dann der Hash vom Einloggen mit dem aus der Datenbank auf Übereinstimmung verglichen werden.

Ich habe mich an folgendem Tutorial orientiert: https://dotnetcodr.com/2017/10/26/how-to-hash-passwords-with-a-salt-in-net-2/

Ich generiere also immer einen zufälligen Hashwert und das auch beim Einloggen. Wenn ich dann also den Hash vom Einloggen mit dem aus der Datenbank pvergleiche, können die nie übereinstimmen, weil eben bei beiden immer ein zufälliger Wert generiert wird.

Hash (beim Erstellen des Benutzers):

public HashWithSaltResult HashWithGenericSalt(string password, int saltLength, HashAlgorithm hashAlgo)
{
    RNG rng = new RNG();
    byte[] saltBytes = rng.GenerateRandomCryptographicBytes(saltLength);
    byte[] passwordAsBytes = Encoding.UTF8.GetBytes(password);
	List<byte> passwordWithSaltBytes = new List<byte>();

    passwordWithSaltBytes.AddRange(saltBytes);
    passwordWithSaltBytes.AddRange(passwordAsBytes);
    byte[] digestBytes = hashAlgo.ComputeHash(passwordWithSaltBytes.ToArray());

    return new HashWithSaltResult(Convert.ToBase64String(saltBytes), Convert.ToBase64String(digestBytes));
}

Hash (beim Einloggen):

public HashWithSaltResult HashWithSalt(string password, string salt, HashAlgorithm hashAlgo)
{
	// Wie hashe ich beim einloggen?
}

Einloggen:

using (var context = new PersonDbContext())
{
	var query = from p in context.Benutzers where textBoxVorname.Text == p.Vorname && textBoxName.Text == p.Name && HashResultSha512.Digest == p.PasswortDigest select p;
    HashPassword();
}

public void HashPassword()
{
    PasswordWithSaltHasher pwHasher = new PasswordWithSaltHasher();
    HashResultSha512 = pwHasher.HashWithSalt();

    db.CheckBenutzerLogin(textBoxVorname.Text, textBoxPasswort.Text, HashResultSha512.Salt, HashResultSha512.Digest);
}

Was muss ich in

public HashWithSaltResult HashWithSalt

schreiben, damit er den Hashwert aus der Datenbank verwendet und nicht wieder einen neuen Wert generiert?

...zur Frage

Password Safe, Version 3.43.0, läßt mich nicht mehr rein, warum??

Hallo

ich havbe auf meinem neuen PC Password Safe, Version 3.43.0 installiert und alle meine Benutzerkennungen und Passwörter eingegeben.

War jetzt ein paar Tage nicht da und die Password Safe läßt mich nicht mehr rein bzw. sagt:

Die Datenbank: C\Users\ABC\onedrive\Dokumente\My Safes\pwsafe.psafe3 konnte nicht geöffnet werden. Wollen Siewoanders danach suchen, eine neue Datenbank anlegen oder Password Safe beenden

Am genannten Ort finde ich nichts.

Bei ABC steht mein Name.

Habe versucht neu zu installieren bzw. ein "Reparatur-Menue" zu bekommen. Jetzt sagt er , dass ich alle Instanzen schließen soll. HAbe alles geschlossen auch im Taskmanager. Geht aber trotzdem nicht :(

Ich bekomme eine mittelschwere Krise, wenn ich nicht an die Passwörter komme. Wer kann mir helfen.

Vielen Dank.

...zur Frage

Was möchtest Du wissen?