Der beste Weg, PHP zu verwenden, um Passwörter zu verschlüsseln und zu entschlüsseln? [Duplikat]

StackOverflow https://stackoverflow.com/questions/1289061

Frage

  

Mögliche Duplizieren:
   PHP 2-Wege-Verschlüsselung: ich brauche Passwörter zu speichern, die abgerufen werden können

Ich plane auf meiner Website für meine Nutzer ausländische Kontodaten zu speichern, auch bekannt als rapidBenutzerNamen und Passwörter, etc ... Ich möchte Informationen sicher halten, aber ich weiß, wenn ich ihre Informationen Hash, ich kann es nicht abrufen für die spätere Verwendung.

Base64 ist zu entschlüsseln-fähig, so gibt es keinen Sinn, dass die Verwendung von einfach nur aus. Meine Idee ist es, den Benutzer zu krabbeln und vergehen, bevor und nachdem es auf diese Weise base64ed wird es auch nach dem Entschlüsseln Sie etwas lustig aussehenden Text, wenn Sie versuchen zu entschlüsseln. Gibt es eine PHP-Funktion, die Werte annimmt, die ein einzigartiges Gerangel eines Strings machen und De-Scramble es später, wenn der Wert reinputed wird?

Irgendwelche Vorschläge?

War es hilfreich?

Lösung

Sie sollten Passwörter nicht verschlüsseln, sondern man sollte sie Hash einen Algorithmus wie bcrypt verwenden. Diese Antwort erklärt, wie man richtig Passwort-Hashing in PHP implementieren. Dennoch ist hier, wie Sie würde Verschlüsselung / Entschlüsselung :

$key = 'password to (en/de)crypt';
$string = ' string to be encrypted '; // note the spaces

verschlüsseln:

$iv = mcrypt_create_iv(
    mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC),
    MCRYPT_DEV_URANDOM
);

$encrypted = base64_encode(
    $iv .
    mcrypt_encrypt(
        MCRYPT_RIJNDAEL_128,
        hash('sha256', $key, true),
        $string,
        MCRYPT_MODE_CBC,
        $iv
    )
);

entschlüsseln:

$data = base64_decode($encrypted);
$iv = substr($data, 0, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC));

$decrypted = rtrim(
    mcrypt_decrypt(
        MCRYPT_RIJNDAEL_128,
        hash('sha256', $key, true),
        substr($data, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC)),
        MCRYPT_MODE_CBC,
        $iv
    ),
    "\0"
);

Warnung : Das obige Beispiel verschlüsselt Informationen, aber es funktioniert nicht authentifiziert den Chiffretext Manipulation zu verhindern. Sie sollten nicht verlassen sich auf nicht authentifizierte Verschlüsselung Sicherheit , vor allem da der Code als zu padding Orakeln Angriffe verwundbar zur Verfügung gestellt.

Siehe auch:

Auch nicht einfach ein „Passwort“ für einen Verschlüsselungsschlüssel verwenden. Verschlüsselungsschlüssel sind zufällige Zeichenfolge.


Demo bei 3v4l.org :

echo 'Encrypted:' . "\n";
var_dump($encrypted); // "m1DSXVlAKJnLm7k3WrVd51omGL/05JJrPluBonO9W+9ohkNuw8rWdJW6NeLNc688="

echo "\n";

echo 'Decrypted:' . "\n";
var_dump($decrypted); // " string to be encrypted "

Andere Tipps

  

Sicherheitswarnung : Diese Klasse ist nicht sicher. Es ist mit Rijndael256-ECB , die semantisch nicht sicher ist. Nur weil „es funktioniert“ bedeutet nicht „es ist sicher“. Auch er streift Räume danach aufgrund nicht mit richtigen Polsterung Tailing.

Gefunden diese Klasse vor kurzem, es funktioniert wie ein Traum!

class Encryption {
    var $skey = "yourSecretKey"; // you can change it

    public  function safe_b64encode($string) {
        $data = base64_encode($string);
        $data = str_replace(array('+','/','='),array('-','_',''),$data);
        return $data;
    }

    public function safe_b64decode($string) {
        $data = str_replace(array('-','_'),array('+','/'),$string);
        $mod4 = strlen($data) % 4;
        if ($mod4) {
            $data .= substr('====', $mod4);
        }
        return base64_decode($data);
    }

    public  function encode($value){ 
        if(!$value){return false;}
        $text = $value;
        $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
        $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
        $crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $this->skey, $text, MCRYPT_MODE_ECB, $iv);
        return trim($this->safe_b64encode($crypttext)); 
    }

    public function decode($value){
        if(!$value){return false;}
        $crypttext = $this->safe_b64decode($value); 
        $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
        $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
        $decrypttext = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $this->skey, $crypttext, MCRYPT_MODE_ECB, $iv);
        return trim($decrypttext);
    }
}

Und es zu nennen:

$str = "My secret String";

$converter = new Encryption;
$encoded = $converter->encode($str );
$decoded = $converter->decode($encoded);    

echo "$encoded<p>$decoded";
  

Sicherheitswarnung:. Dieser Code ist nicht sicher

Arbeitsbeispiel

define('SALT', 'whateveryouwant'); 

function encrypt($text) 
{ 
    return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, SALT, $text, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)))); 
} 

function decrypt($text) 
{ 
    return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, SALT, base64_decode($text), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND))); 
} 

$encryptedmessage = encrypt("your message"); 
echo decrypt($encryptedmessage); 

Eine Sache sollten Sie sehr bewusst sein, wenn sie mit Verschlüsselung zu tun:

Der Versuch, klug zu sein und dein eigenes Ding zu erfinden, in der Regel werden Sie mit etwas unsicher verlassen.

Sie würden wahrscheinlich am besten an einen der Kryptographie-Erweiterungen mit , die kommen mit PHP.

Dies wird Ihnen nur marginal Schutz. Wenn die Angreifer beliebigen Code in Ihrer Anwendung ausführen können, können sie auf den Passwörtern auf genau die gleiche Art und Weise erhalten Sie Ihre Anwendung kann. Sie könnten immer noch einen gewissen Schutz vor einigen SQL-Injection-Angriffe und fehl am Platze db Backups erhalten, wenn Sie einen geheimen Schlüssel in einer Datei speichern und verwenden, die auf dem Weg zum db zu verschlüsseln und sich auf den Weg zu entschlüsseln. Aber Sie sollten bindparams verwenden, um vollständig das Problem der SQL-Injektion zu vermeiden.

Wenn entscheiden zu verschlüsseln, sollten Sie einige hohe Krypto-Bibliothek für diese verwenden oder wird bekommen es falsch. Hier finden Sie die Schlüssel-Setup, Nachrichten Polsterung und Integritätsprüfungen richtig, oder alle Ihrer Verschlüsselung Aufwand ist von geringen Nutzen bekommen. GPGME ist eine gute Wahl für ein Beispiel. Mcrypt ist zu niedrigem Niveau, und Sie werden wahrscheinlich etwas falsch gemacht.

  

Securiy Warnung : Dieser Code ist unsicher . Neben anfällig für ausgewählte Geheimtext-Attacken zu sein, die Abhängigkeit von unserialize() macht es zu PHP Object Injection verwundbar.

Um einen String / Array behandeln ich diese zwei Funktionen:

function encryptStringArray ($stringArray, $key = "Your secret salt thingie") {
 $s = strtr(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), serialize($stringArray), MCRYPT_MODE_CBC, md5(md5($key)))), '+/=', '-_,');
 return $s;
}

function decryptStringArray ($stringArray, $key = "Your secret salt thingie") {
 $s = unserialize(rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode(strtr($stringArray, '-_,', '+/=')), MCRYPT_MODE_CBC, md5(md5($key))), "\0"));
 return $s;
}

Es ist flexibel wie in Sie können speichern / senden eine Zeichenfolge oder ein Array über eine URL, da die Zeichenfolge / Array vor der Verschlüsselung serialzed wird.

Überprüfen Sie heraus mycrypt (): http://us.php.net /manual/en/book.mcrypt.php

Und wenn Sie Postgres es pgcrypto für Datenbank-Level-Verschlüsselung verwenden. (Macht es einfacher zu suchen und sortieren)

Die beste Idee zum Verschlüsseln / Entschlüsseln Sie Ihre Daten in der Datenbank, auch wenn Sie Zugriff auf den Code haben, ist anders zu verwenden, 2 geht ein eigenes Passwort (user-pass) für jeden Benutzer und einen eigenen Code für alle Benutzer (system-pass).

Szenario

  1. user-pass mit md5 in der Datenbank gespeichert und verwendet wird, um jeden Benutzer zu validieren, um in das System einzuloggen. Dieser Benutzer-Pass ist andere für jeden Benutzer.
  2. Jeder Benutzereintrag in der Datenbank hat in md5 eine system-pass für die Verschlüsselung / Entschlüsselung der Daten. Dieses System Pass ist die gleiche für jeden Benutzer.
  3. Jedes Mal, wenn ein Benutzer aus dem System entfernt wird alle Daten, die unter einem neuen System-Pass unter dem alten System Pass verschlüsselt werden müssen, um wieder verschlüsselt werden, um Sicherheitsprobleme zu vermeiden.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top