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.
Ausgezeichnet, danke für die Information – dlofrodloh
Warum ein Mac der Verschlüsselung erstellen, wenn es während der Entschlüsselung nicht überprüft wird? – zaph
@zaph, das ist eine gute Frage. Nicht sicher was Taylors Prozess war, war dies. –