it-swarm.com.de

Der beste Weg, um PHP zum Ver- und Entschlüsseln von Passwörtern zu verwenden?

Mögliches Duplikat:
PHP-2-Wege-Verschlüsselung: Ich muss Kennwörter speichern, die abgerufen werden können

Ich habe vor, für meine Benutzer ausländische Kontoinformationen auf meiner Website zu speichern, z. B. Rapidshare-Benutzernamen und -Kennwörter. Ich möchte die Informationen sicher aufbewahren, weiß jedoch, dass ich sie nicht für eine spätere Verwendung abrufen kann, wenn ich sie habe .

Base64 kann entschlüsselt werden, es macht also keinen Sinn, dies einfach zu verwenden. Meine Idee ist, den Benutzer zu verschlüsseln und zu übergeben, bevor und nachdem er auf diese Weise base64ed wird, obwohl Sie ihn entschlüsselt haben, erhalten Sie einen witzig aussehenden Text, wenn Sie versuchen, ihn zu entschlüsseln. Gibt es eine PHP-Funktion, die Werte akzeptiert, die ein eindeutiges Scramble eines Strings erzeugen und es später wieder entschlüsseln, wenn der Wert erneut eingegeben wird?

Irgendwelche Vorschläge?

214
jiexi

Sie sollten Passwörter nicht verschlüsseln, sondern sie mit einem Algorithmus wie bcrypt hacken. Diese Antwort erklärt, wie man Passwort-Hashing in PHP richtig implementiert . Dennoch, hier ist, wie Sie verschlüsseln/entschlüsseln würden:

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

Zum 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
    )
);

Zum 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 : Im obigen Beispiel werden Informationen verschlüsselt, der Chiffretext wird jedoch nicht authentifiziert, um Manipulationen zu verhindern. Sie sollten nicht sich aus Sicherheitsgründen auf nicht authentifizierte Verschlüsselung verlassen , zumal der bereitgestellte Code anfällig für das Auffüllen von Oracle-Angriffen ist.

Siehe auch:

Verwenden Sie nicht nur ein "Passwort" für einen Verschlüsselungsschlüssel. Verschlüsselungsschlüssel sind zufällige Zeichenfolgen.


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 "
298
Alix Axel

Sicherheitswarnung : Diese Klasse ist nicht sicher. Es verwendet Rijndael256-ECB , was semantisch nicht sicher ist. Nur weil "es funktioniert", heißt das nicht "es ist sicher". Außerdem werden die Laderäume nachträglich entfernt, da keine ordnungsgemäße Polsterung verwendet wird.

Fand 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 um es zu nennen:

$str = "My secret String";

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

echo "$encoded<p>$decoded";
33
wilsonpage

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); 
18
stasl

Eine Sache, die Sie beim Umgang mit Verschlüsselung sehr beachten sollten:

Wenn du versuchst, klug zu sein und dein eigenes Ding zu erfinden, hast du normalerweise etwas Unsicheres.

Am besten verwenden Sie wahrscheinlich eine der Kryptografie-Erweiterungen , die mit PHP geliefert werden.

Dies schützt Sie nur am Rande. Wenn der Angreifer beliebigen Code in Ihrer Anwendung ausführen kann, kann er die Kennwörter genauso abrufen wie Ihre Anwendung. Sie könnten immer noch einen gewissen Schutz vor SQL-Injection-Angriffen und verlegten Datenbank-Backups erhalten, wenn Sie einen geheimen Schlüssel in einer Datei speichern und diesen auf dem Weg zur Datenbank verschlüsseln und auf dem Weg nach draußen entschlüsseln. Sie sollten jedoch bindparams verwenden, um das Problem der SQL-Injection vollständig zu vermeiden.

Wenn Sie sich für die Verschlüsselung entscheiden, sollten Sie dafür eine hochrangige Kryptobibliothek verwenden, oder Sie werden falsch liegen. Sie müssen die Schlüsselkonfiguration, das Auffüllen von Nachrichten und die Integritätsprüfungen korrekt durchführen, da sonst der gesamte Aufwand für die Verschlüsselung von geringem Nutzen ist. GPGME ist eine gute Wahl für ein Beispiel. Mcrypt ist zu niedrig und Sie werden es wahrscheinlich falsch verstehen.

2
Ants Aasma

Sicherheitswarnung: Dieser Code ist unsicher . Das Vertrauen in unserialize() ist nicht nur anfällig für Chiffretext-Angriffe, sondern auch für PHP Object Injection.

Um mit einem String/Array umzugehen, benutze ich diese beiden 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, da Sie eine Zeichenfolge oder ein Array über eine URL speichern/senden können, da die Zeichenfolge/das Array vor der Verschlüsselung serialisiert wird.

2
Martin

Check out mycrypt (): http://us.php.net/manual/en/book.mcrypt.php

Und wenn Sie Postgres verwenden, gibt es pgcrypto für die Verschlüsselung auf Datenbankebene. (erleichtert das Suchen und Sortieren)

1
Josh Rice