Der beste Weg, um Passwörter mit PHP zu verschlüsseln und zu entschlüsseln?


Answers

Sicherheitswarnung : Diese Klasse ist nicht sicher. Es verwendet Rijndael256-ECB , das nicht semantisch sicher ist. Nur weil "es funktioniert" bedeutet nicht "es ist sicher". Außerdem entfernt es hinterher Lücken, da keine richtige Füllung 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 es zu nennen:

$str = "My secret String";

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

echo "$encoded<p>$decoded";
Question

Mögliche Duplikate:
PHP 2-Wege-Verschlüsselung: Ich muss Passwörter speichern, die abgerufen werden können

Ich plane, ausländische Kontoinformationen für meine Benutzer auf meiner Website zu speichern, alias rapidshare Benutzername und Passwörter, etc ... Ich möchte Informationen sicher aufbewahren, aber ich weiß, dass ich sie nicht abrufen kann, wenn ich sie später hasse .

Base64 kann entschlüsselt werden, so dass es keinen Sinn macht, das einfach zu verwenden. Meine Idee ist, den Benutzer zu scramble und vor und nach dem es base64ed erhält, selbst nachdem Sie es entschlüsseln, erhalten Sie einige lustig aussehende Text, wenn Sie versuchen, zu entschlüsseln. Gibt es eine PHP-Funktion, die Werte akzeptiert, die ein eindeutiges Scramble eines Strings verursachen und es später entschlüsseln, wenn der Wert neu berechnet wird?

Irgendwelche Vorschläge?




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

Der Versuch, clever zu sein und dein eigenes Ding zu erfinden, wird dich normalerweise mit etwas unsicherem belästigen.

Sie sollten wahrscheinlich eine der Kryptografieerweiterungen verwenden , die mit PHP geliefert werden.




Sicherheitshinweis : Dieser Code ist unsicher . Das unserialize() ist nicht nur anfällig für Angriffe mit ausgewählten Chiffretexten, unserialize() macht sich durch die Verwendung von unserialize() anfällig für PHP Object Injection.

Um eine Zeichenfolge / ein Array zu behandeln, verwende 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, da Sie über eine URL eine Zeichenfolge oder ein Array speichern / senden können, da die Zeichenfolge / das Array vor der Verschlüsselung serialisiert wird.




Die beste Idee, um Ihre Daten in der Datenbank zu verschlüsseln / entschlüsseln, selbst wenn Sie Zugriff auf den Code haben, ist die Verwendung von zwei verschiedenen user-pass ein privates Passwort ( user-pass ) für jeden Benutzer und einen privaten Code für alle Benutzer ( system-pass ).

Szenario

  1. user-pass wird mit MD5 in der Datenbank gespeichert und wird verwendet, um jeden Benutzer für die Anmeldung am System zu validieren. Dieser Benutzerpass ist für jeden Benutzer unterschiedlich.
  2. Jeder Benutzereintrag in der Datenbank hat in md5 einen system-pass für die Verschlüsselung / Entschlüsselung der Daten. Dieser Systempass ist für jeden Benutzer gleich.
  3. Jedes Mal, wenn ein Benutzer aus dem System entfernt wird, müssen alle Daten, die unter dem alten Systempass verschlüsselt sind, erneut unter einem neuen Systempass verschlüsselt werden, um Sicherheitsprobleme zu vermeiden.