2010-12-28 5 views
0

Ich gehe gerade über meinen Benutzerregistrierungscode. Der Teil, auf den ich mich gerade konzentriere, ist der Password Hashing Teil.Wie kann ich eine Funktion nur einmal laden und die Rückgabe in einer Variablen speichern?

Was ich tue ist eine static_salt aus einer Konfigurationsdatei, und verwenden Sie mt_rand(), um eine dynamische_Salz zu generieren. Was ich tun möchte, ist diese dynamic_salt in meiner Datenbank gespeichert zu haben.

Wenn ich jedoch die Methode dynamic_salt() an die create-Methode übergebe, um sie an die Spalte salt einer Tabelle in meiner Datenbank zu senden, führt sie die Methode einfach erneut aus und erzeugt ein anderes Ergebnis als das in my hashed() -Methode.

Was wäre der beste Weg, um das zu erreichen, was ich erreichen möchte, könnten Sie mir ein Beispiel zeigen, wenn möglich?

public function create() { 

       $dbcolumn->password = $this->hashed(); 
       $dbcolumn->salt = $this->dynamic_salt; 
       $this->db->insert('users', $dbcolumn); 

    } 

public function dynamic_salt() { 

      $get_dynamic_salt = mt_rand(); 
      return $get_dynamic_salt; 
} 

public function hashed() { //hashing method, that also makes 
      // sha1 and salt password 
      $static_salt = $this->config->item('encryption_key'); //grab static salt from config file 
      $dynamic_salt = $this->dynamic_salt(); 

     $password = $this->encrypt->sha1($this->input->post('password')); //encrypt user password 
      $hashed = sha1($dynamic_salt . $password . $static_salt); 

      return $hashed; 
} 
+0

hat die Bearbeitung gemacht $ dbcolumn-> salt = $ this-> dynamic_salt; – LondonGuy

+0

Mir wurde gesagt, dass ich kein dynamisches Salz verwenden soll und dass es riskant ist, ein Salz in der Datenbank zu speichern – LondonGuy

+0

Ich denke du meinst '$ dbcolumn-> salt = $ this-> dynamic_salt();'? Warum auch all das benutzen? warum benutze nicht einfach md5 und setze eine beschränkung auf das passwort (alphanumerisch, min_length ... etc), ich weiß dass du das seit du [CI] verwendest (http://codeignit.com/user_guide/libraries/form_validation.html) – ifaour

Antwort

2

Ich empfehle, dass Sie kein dynamisches Salz verwenden, da es die Flexibilität Ihrer Anwendungen verringert und wahrscheinlich nicht in der aktuellen Form funktioniert.

Der Zweck einer salt ist, gegen dictionary attacks zu verhindern, dass jemand tun könnte, wenn sie Ihre Benutzerdatenbank erhielten. In dieser Hinsicht ist eine statische Salz definitiv eine gute Idee, um in Ihrer Anwendung zu implementieren.

Das Hinzufügen eines dynamischen Salt zu jedem Benutzer würde bedeuten, dass Sie einen Datenspeicher treffen müssen, um das dynamische Salt und die Hash-Version des Benutzerkennworts abzurufen, dann müssen Sie die CPU-intensive Hash-Funktion (in Ihrem Code) ausführen , zweimal - Sie haben einen Hash, der weniger sicher ist und eher Kollisionen verursacht.

Mit einem einfachen bekannten, statischen Salz und einem Hash-Passwort können Sie Schlüssel/Wert-Speichersysteme wie memcache verwenden, wenn Ihre Anwendung wächst. Speichern Sie die Benutzer-ID als Schlüssel, und die Benutzer haben das Kennwort als Wert hashed, und Sie erhalten ein blitzschnelles Authentifizierungssystem.

+0

Danke, genau das sagte der andere zu mir. Gibt es einen Sinn, gefälschte, zufällig erzeugte Salze in der Datenbank zu speichern, um den Hacker zu verwirren? oder ist das nur eine Verschwendung von Raum und Zeit? public function my_salt() { // Salz erzeugen $ my_salt = random_string ('alnum', 32); Rückgabe $ my_salt; } – LondonGuy

+0

Es ist wahrscheinlich nur eine Zeitverschwendung, etwas mit einem dynamischen Salz zu tun. Selbst wenn es einem Angreifer gelungen ist, sowohl das statische Salz als auch die Benutzerkennwörter zu erhalten, muss er trotzdem den Prozess der Brute-Force-Passwort-Cracking durchlaufen, um das ursprüngliche Passwort des Benutzers (oder das Passwort, das den gleichen Hashwert erzeugt) anzuzeigen. –

1

Try this:

public function dynamic_salt() { 
    if(!isset($this->dyn_salt)) 
     $this->dyn_salt = mt_rand(); 
    return $this->dyn_salt; 
} 

Wenn die dyn_salt Instanzvariable nicht bereits vorhanden ist, wird es es das Ergebnis mt_rand() zuweisen, sonst wird es nur den vorherigen Wert zurück.

Verwandte Themen