2016-04-26 11 views
0

Ich habe ein Projekt, das aus 2 Teilen, Webpart und Java-Teil besteht, im Web One, ich benutze Symfony mit FOSUserBundle Benutzer zu verwalten, teilen sich die 2 Anwendungen die gleichen Datenbank. FOSUserBundle verwendet eine SHA1 um das Passwort zu verschlüsseln, ich möchte mit der Java App authentifizieren, aber ich konnte nicht herausfinden, wie die Salting Mecanisme in Symfony funktioniert. In der [Model/User.php][1] Klasse im Konstruktor, gibt es online:Wie speichert Symfony FOSUserBundle das Salz

$this->salt = base_convert(sha1(uniqid(mt_rand(), true)), 16, 36); 

Wie wir hier sehen können, ist das Salz erzeugt mt_rand() Verwendung einer Zufallszahl, Ich habe 2 Fragen hier, wenn das Salz „ist zufällig "Wie wird dann ein neuer Salt generiert, um ihn mit dem in der Datenbank zu vergleichen? und ist das Salz irgendwo gespeichert?

+0

Es wird zusammen mit dem Hashwert in der Datenbank gespeichert. – zerkms

+0

Wenn es nicht in einer separaten Spalte gespeichert ist, wie wird es abgerufen? –

+1

Haben Sie versucht, die Datenbank zu überprüfen? Und Code vielleicht? – zerkms

Antwort

1

Stellen Sie sicher, dass die Datenbank, in der Sie alle Felder speichern, den FOSUserBundle korrekt referenziert. Es klingt wie, weil Sie Ihre Eltern- und Kindkonstruktoren nicht richtig definiert haben, dass es einfach ein leeres Salz ist, das auf die Kennwörter angewendet wird, die Sie es geben, daher die verschiedenen Hash-Zeichenfolgen, wenn das Salz angewendet wird.

Ein kurzes Beispiel:

Rufen Sie das Salz aus dem Benutzer:

$encoder_service = $this->get('security.encoder_factory'); 
$encoder = $encoder_service->getEncoder($user); 

aktuellen Hash-Passwort abrufen von Benutzer und Salz das neue Passwort

$currentpass = $user->getPassword(); 
$newpass = $encoder->encodePassword($newPassword, $user->getSalt()); 

Dann können Sie auf zwei vergleichen Hashes, um sicherzustellen, dass das zu analysierende Passwort mit dem gespeicherten Passwort übereinstimmt

if (strcmp($currentpass, $newpass) == 0) { 
     // if two passwords are the same, do something here 
} else { 
     throw $this->createNotFoundException('Error here'); 
} 
+0

'strcmp ($ currentpass, $ newpass)' --- man sollte '\ Symfony \ Component \ Security \ Core \ Util \ StringUtils :: equals()' verwenden Vergleichen Sie Hashes in konstanter Zeit. – zerkms

+0

Ja, ich stimme dir zu, das ist mir nicht in den Sinn gekommen, als ich ein schnelles Beispiel für das OP anklopfte, also habe ich nur den String-Vergleich benutzt – Brendan

Verwandte Themen