it-swarm.dev

Come crittografare/decrittografare i dati in php?

Sono attualmente uno studente e sto studiando PHP, sto cercando di fare una semplice crittografia/decodifica dei dati in PHP. Ho fatto alcune ricerche online e alcune di queste erano abbastanza confuse (almeno per me).

Ecco cosa sto cercando di fare:

Ho una tabella composta da questi campi (UserID, Fname, Lname, Email, Password)

Quello che voglio è avere tutti i campi cifrati e poi decrittografati (è possibile usare sha256 per la crittografia/decodifica, se non l'algoritmo di crittografia)

Un'altra cosa che voglio imparare è come creare un hash(sha256) unidirezionale combinato con un buon "salt" . (In pratica voglio solo avere una semplice implementazione di crittografia/decodifica, hash(sha256)+salt) Sir/Ma'am, le tue risposte saranno di grande aiuto e saranno molto apprezzate. Grazie ++

102
Randel Ramirez

Penso che questo sia stato risolto prima ... ma comunque, se vuoi criptare/decodificare i dati, non puoi usare SHA256

//Key
$key = 'SuperSecretKey';

//To Encrypt:
$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, 'I want to encrypt this', MCRYPT_MODE_ECB);

//To Decrypt:
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $encrypted, MCRYPT_MODE_ECB);
21
romo

Rispondi a Sfondo e Spiegazione

Per capire questa domanda, devi prima capire che cos'è SHA256. SHA256 è una funzione hash crittografica. Una funzione hash crittografica è una funzione unidirezionale, il cui output è crittograficamente sicuro. Ciò significa che è facile calcolare un hash (equivalente alla crittografia dei dati), ma è difficile ottenere l'input originale usando l'hash (equivalente alla decrittografia dei dati). Poiché l'uso di una funzione di hash crittografica significa che la decodifica è computazionalmente non fattibile, quindi non è possibile eseguire la decrittografia con SHA256. 

Quello che vuoi usare è una funzione bidirezionale, ma più specificamente un Block Cipher. Una funzione che consente sia la crittografia che la decrittografia dei dati. Le funzioni mcrypt_encrypt e mcrypt_decrypt di default utilizzano l'algoritmo Blowfish. L'uso di PHP di mcrypt può essere trovato in questo manual . Esiste anche un elenco di definizioni di crittografia per selezionare gli usi di cifratura mcrypt. Un wiki su Blowfish può essere trovato su Wikipedia . Un cifrario a blocchi codifica l'input in blocchi di dimensione e posizione note con una chiave nota, in modo che i dati possano essere successivamente decodificati utilizzando la chiave. Questo è ciò che SHA256 non può fornirti.

Codice

$key = 'ThisIsTheCipherKey';

$ciphertext = mcrypt_encrypt(MCRYPT_BLOWFISH, $key, 'This is plaintext.', MCRYPT_MODE_CFB);

$plaintext = mcrypt_decrypt(MCRYPT_BLOWFISH, $key, $encrypted, MCRYPT_MODE_CFB);
14
cytinus

Ecco un esempio usando openssl_encrypt 

//Encryption:
$textToEncrypt = "My Text to Encrypt";
$encryptionMethod = "AES-256-CBC";
$secretHash = "encryptionhash";
$iv = mcrypt_create_iv(16, MCRYPT_Rand);
$encryptedText = openssl_encrypt($textToEncrypt,$encryptionMethod,$secretHash, 0, $iv);

//Decryption:
$decryptedText = openssl_decrypt($encryptedText, $encryptionMethod, $secretHash, 0, $iv);
print "My Decrypted Text: ". $decryptedText;
8
Vivek
     function my_simple_crypt( $string, $action = 'e' ) {
        // you may change these values to your own
        $secret_key = 'my_simple_secret_key';
        $secret_iv = 'my_simple_secret_iv';

        $output = false;
        $encrypt_method = "AES-256-CBC";
        $key = hash( 'sha256', $secret_key );
        $iv = substr( hash( 'sha256', $secret_iv ), 0, 16 );

        if( $action == 'e' ) {
            $output = base64_encode( openssl_encrypt( $string, $encrypt_method, $key, 0, $iv ) );
        }
        else if( $action == 'd' ){
            $output = openssl_decrypt( base64_decode( $string ), $encrypt_method, $key, 0, $iv );
        }

        return $output;
    }
1

Mi ci è voluto un po 'per capire come non ottenere un false quando si usa openssl_decrypt() e si cripta e decifri il funzionamento. 

    // cryptographic key of a binary string 16 bytes long (because AES-128 has a key size of 16 bytes)
    $encryption_key = '58adf8c78efef9570c447295008e2e6e'; // example
    $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));
    $encrypted = openssl_encrypt($plaintext, 'aes-256-cbc', $encryption_key, OPENSSL_RAW_DATA, $iv);
    $encrypted = $encrypted . ':' . base64_encode($iv);

    // decrypt to get again $plaintext
    $parts = explode(':', $encrypted);
    $decrypted = openssl_decrypt($parts[0], 'aes-256-cbc', $encryption_key, OPENSSL_RAW_DATA, base64_decode($parts[1])); 

Se si desidera passare la stringa crittografata tramite un URL, è necessario urlencode la stringa: 

    $encrypted = urlencode($encrypted);

Per capire meglio cosa sta succedendo, leggi: 

Per generare chiavi lunghe 16 byte puoi usare: 

    $bytes = openssl_random_pseudo_bytes(16);
    $hex = bin2hex($bytes);

Per vedere i messaggi di errore di openssl puoi usare: echo openssl_error_string();

Spero che sia d'aiuto.

0
Kai Noack