2016-07-01 16 views
0

Meine Datenbank speichert die Login-Passwörter des Benutzers in MD5. Wenn sie sich anmelden, vergleicht sie ihr eingegebenes Passwort mit dem MD5-Passwort in MD5.So speichern Sie ein Passwort, wenn Sie den tatsächlichen Passwort-Text benötigen

Ich implementiere Funktionalität, wo die Anwendung eine Verbindung zu ihrem E-Mail-Konto mit IMAP herstellen kann. Ich muss also das Passwort des Benutzers für das E-Mail-Konto in der Datenbank speichern, aber soweit ich weiß, kann ich MD5 nicht verwenden, da ich sein Passwort als einfachen Text für die Verbindung über eine IMAP-Verbindung verwenden muss.

Was wäre eine Lösung, um ihr Passwort sicher in der Datenbank zu speichern, aber in der Lage zu sein, es zu erhalten und in Klartext in einem Skript zu konvertieren?

Antwort

0

Zunächst einmal ist MD5 keine sichere Methode zum Speichern von Kennwörtern. Werfen Sie einen Blick auf die password_hash Funktion und bcrypt für eine moderne und sichere Lösung. Siehe auch: How do you use bcrypt for hashing passwords in PHP?

Wie für das IMAP-Passwort, müssen Sie nicht benötigen Hashing, da diese "one-way" sind. Sie benötigen einen Verschlüsselungsalgorithmus.

Eine der besseren Optionen ist die Verwendung von openssl_encrypt() und eines auf dem Server gespeicherten sicheren Schlüssels. Dies ist der Ansatz, den Laravel zum Beispiel verfolgt.

Werfen Sie einen Blick auf diese als Beispiel: https://github.com/laravel/framework/blob/5.2/src/Illuminate/Encryption/Encrypter.php#L62

/** 
* Encrypt the given value. 
* 
* @param string $value 
* @return string 
* 
* @throws \Illuminate\Contracts\Encryption\EncryptException 
*/ 
public function encrypt($value) 
{ 
    $iv = random_bytes($this->getIvSize()); 
    $value = \openssl_encrypt(serialize($value), $this->cipher, $this->key, 0, $iv); 
    if ($value === false) { 
     throw new EncryptException('Could not encrypt the data.'); 
    } 
    // Once we have the encrypted value we will go ahead base64_encode the input 
    // vector and create the MAC for the encrypted value so we can verify its 
    // authenticity. Then, we'll JSON encode the data in a "payload" array. 
    $mac = $this->hash($iv = base64_encode($iv), $value); 
    $json = json_encode(compact('iv', 'value', 'mac')); 
    if (! is_string($json)) { 
     throw new EncryptException('Could not encrypt the data.'); 
    } 
    return base64_encode($json); 
} 
/** 
* Decrypt the given value. 
* 
* @param string $payload 
* @return string 
* 
* @throws \Illuminate\Contracts\Encryption\DecryptException 
*/ 
public function decrypt($payload) 
{ 
    $payload = $this->getJsonPayload($payload); 
    $iv = base64_decode($payload['iv']); 
    $decrypted = \openssl_decrypt($payload['value'], $this->cipher, $this->key, 0, $iv); 
    if ($decrypted === false) { 
     throw new DecryptException('Could not decrypt the data.'); 
    } 
    return unserialize($decrypted); 
} 
/** 
* Get the IV size for the cipher. 
* 
* @return int 
*/ 
protected function getIvSize() 
{ 
    return 16; 
} 

Offensichtlich dass Laravel Code auf anderen Teilen Laravel beruht, sondern als Beispiel, ist dies ausreichend. Sobald Sie den verschlüsselten Wert haben, können Sie ihn in Ihrer Datenbank speichern.

Beachten Sie, dass die Sicherheit nur so stark ist wie der schwächste Link. Stellen Sie daher sicher, dass Ihre Datenbankanmeldeinformationen sicher sind und Ihr Datenbankbenutzer über die Mindestanzahl von Berechtigungen verfügt, damit Ihre Anwendung funktioniert.

+1

Ausgezeichnet, danke für die Information – dlofrodloh

+0

Warum ein Mac der Verschlüsselung erstellen, wenn es während der Entschlüsselung nicht überprüft wird? – zaph

+0

@zaph, das ist eine gute Frage. Nicht sicher was Taylors Prozess war, war dies. –