270 votes

Comment crypter et décrypter une chaîne PHP ?

Ce que je veux dire, c'est que :

Original String + Salt or Key --> Encrypted String
Encrypted String + Salt or Key --> Decrypted (Original String)

Peut-être quelque chose comme :

"hello world!" + "ABCD1234" --> Encrypt --> "2a2ffa8f13220befbe30819047e23b2c" (may be, for e.g)
"2a2ffa8f13220befbe30819047e23b2c" --> Decrypt with "ABCD1234" --> "hello world!"
  • En PHP, comment faire ?

_(Tentative d'utilisation de Crypt_Blowfish mais cela n'a pas fonctionné pour moi)_

43 votes

@Rogue Il ne veut pas de hachage, il veut un cryptage symétrique (comme AES), mais il ne sait pas comment ça s'appelle. (Et maintenant il le sait :) )

0 votes

Quelle doit être la sécurité ?

3 votes

@, Vous ne faites pas de cryptage symétrique "salé", vous utilisez une clé. Une clé doit être gardée secrète. Un sel peut être public sans nuire à la sécurité (tant que le sel de chacun est différent), et c'est un terme utilisé dans le hachage des mots de passe.

10voto

Ascon Points 161

Si vous ne voulez pas utiliser la bibliothèque (ce que vous devriez faire), utilisez quelque chose comme ceci (PHP 7) :

function sign($message, $key) {
    return hash_hmac('sha256', $message, $key) . $message;
}

function verify($bundle, $key) {
    return hash_equals(
      hash_hmac('sha256', mb_substr($bundle, 64, null, '8bit'), $key),
      mb_substr($bundle, 0, 64, '8bit')
    );
}

function getKey($password, $keysize = 16) {
    return hash_pbkdf2('sha256',$password,'some_token',100000,$keysize,true);
}

function encrypt($message, $password) {
    $iv = random_bytes(16);
    $key = getKey($password);
    $result = sign(openssl_encrypt($message,'aes-256-ctr',$key,OPENSSL_RAW_DATA,$iv), $key);
    return bin2hex($iv).bin2hex($result);
}

function decrypt($hash, $password) {
    $iv = hex2bin(substr($hash, 0, 32));
    $data = hex2bin(substr($hash, 32));
    $key = getKey($password);
    if (!verify($data, $key)) {
      return null;
    }
    return openssl_decrypt(mb_substr($data, 64, null, '8bit'),'aes-256-ctr',$key,OPENSSL_RAW_DATA,$iv);
}

$string_to_encrypt='John Smith';
$password='password';
$encrypted_string=encrypt($string_to_encrypt, $password);
$decrypted_string=decrypt($encrypted_string, $password);

0 votes

Peut-il s'agir d'un remplacement de stackoverflow.com/a/16606352/126833 ? J'ai utilisé la première solution jusqu'à ce que mon hébergeur passe à PHP 7.2.

0 votes

@anjanesh vous ne pourrez pas décrypter les anciennes données avec celui-ci (algorithmes différents + celui-ci vérifie aussi la signature)

2 votes

Dans votre cas, cela devrait faire l'affaire : define("ENCRYPTION_KEY", "123456*"); $string = "This is the original data string!"; $encrypted = openssl_encrypt($string, 'BF-ECB', ENCRYPTION_KEY); $decrypted = openssl_decrypt($encrypted,'BF-ECB',ENCRYPTION_KEY);

10voto

Marco Concas Points 329

Ce sont des méthodes compactes pour crypter / décrypter des chaînes de caractères avec PHP en utilisant AES256 CBC :

function encryptString($plaintext, $password, $encoding = null) {
    $iv = openssl_random_pseudo_bytes(16);
    $ciphertext = openssl_encrypt($plaintext, "AES-256-CBC", hash('sha256', $password, true), OPENSSL_RAW_DATA, $iv);
    $hmac = hash_hmac('sha256', $ciphertext.$iv, hash('sha256', $password, true), true);
    return $encoding == "hex" ? bin2hex($iv.$hmac.$ciphertext) : ($encoding == "base64" ? base64_encode($iv.$hmac.$ciphertext) : $iv.$hmac.$ciphertext);
}

function decryptString($ciphertext, $password, $encoding = null) {
    $ciphertext = $encoding == "hex" ? hex2bin($ciphertext) : ($encoding == "base64" ? base64_decode($ciphertext) : $ciphertext);
    if (!hash_equals(hash_hmac('sha256', substr($ciphertext, 48).substr($ciphertext, 0, 16), hash('sha256', $password, true), true), substr($ciphertext, 16, 32))) return null;
    return openssl_decrypt(substr($ciphertext, 48), "AES-256-CBC", hash('sha256', $password, true), OPENSSL_RAW_DATA, substr($ciphertext, 0, 16));
}

Utilisation :

$enc = encryptString("mysecretText", "myPassword");
$dec = decryptString($enc, "myPassword");

8voto

Kathir Points 504

Cryptage et décryptage à l'aide de md5. Le site md5() calcule le hachage MD5 d'une chaîne de caractères.

md5() et sha1() fournit la même fonctionnalité de cryptage en php, mais ils diffèrent d'une manière simple. md5() génère 32 caractères de chaîne cryptée qui sha1() génère le même de 40 caractères.

Essaie ça. Cela fonctionne bien pour moi.

function encrypt_decrypt($action, $string) {
   $output = false;

   $key = 'My strong random secret key';

   // initialization vector 
   $iv = md5(md5($key));

   if( $action == 'encrypt' ) {
       $output = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, $iv);
       $output = base64_encode($output);
   }
   else if( $action == 'decrypt' ){
       $output = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($string), MCRYPT_MODE_CBC, $iv);
       $output = rtrim($output, "");
   }
   return $output;
}

$plain_txt = "This is my plain text";

$encrypted_txt = encrypt_decrypt('encrypt', $plain_txt);
echo "Encrypted Text = $encrypted_txt\n";
echo "<br />";
$decrypted_txt = encrypt_decrypt('decrypt', $encrypted_txt);
echo "Decrypted Text = $decrypted_txt\n";

8voto

BrianDHall Points 1632

Idéalement, vous avez - ou pouvez avoir - accès à la bibliothèque PHP mcrypt, car elle est très populaire et très utile pour diverses tâches. Voici un aperçu des différents types de cryptage et quelques exemples de code : Techniques de cryptage en PHP

//Listing 3: Encrypting Data Using the mcrypt_ecb Function 

<?php 
echo("<h3> Symmetric Encryption </h3>"); 
$key_value = "KEYVALUE"; 
$plain_text = "PLAINTEXT"; 
$encrypted_text = mcrypt_ecb(MCRYPT_DES, $key_value, $plain_text, MCRYPT_ENCRYPT); 
echo ("<p><b> Text after encryption : </b>"); 
echo ( $encrypted_text ); 
$decrypted_text = mcrypt_ecb(MCRYPT_DES, $key_value, $encrypted_text, MCRYPT_DECRYPT); 
echo ("<p><b> Text after decryption : </b>"); 
echo ( $decrypted_text ); 
?> 

Quelques avertissements :

1) N'utilisez jamais de cryptage réversible ou "symétrique" lorsqu'un hachage à sens unique suffit.

2) Si les données sont vraiment sensibles, comme les numéros de carte de crédit ou de sécurité sociale, arrêtez ; vous avez besoin de plus que n'importe quel simple morceau de code, mais plutôt d'une bibliothèque cryptographique conçue à cet effet et d'une quantité significative de temps pour rechercher les méthodes nécessaires. De plus, la cryptographie logicielle représente probablement <10% de la sécurité des données sensibles. C'est comme recâbler une centrale nucléaire - acceptez que la tâche soit dangereuse et difficile et qu'elle dépasse vos connaissances si c'est le cas. Les sanctions financières peuvent être immenses, il vaut donc mieux utiliser un service et lui confier la responsabilité.

3) Tout type de cryptage facile à mettre en œuvre, tel qu'indiqué ici, peut raisonnablement protéger des informations légèrement importantes que vous souhaitez protéger des regards indiscrets ou limiter l'exposition en cas de fuite accidentelle/intentionnelle. Mais étant donné que la clé est stockée en texte clair sur le serveur web, s'ils peuvent obtenir les données, ils peuvent obtenir la clé de décryptage.

Quoi qu'il en soit, amusez-vous bien :)

2 votes

Merci ! Mais quelques problèmes. Je reçois Mf=_= caractères étranges comme celui qui est crypté. Je ne peux pas avoir des caractères simples ? Comme : 2a2ffa8f13220befbe30819047e23b2c . De plus, je ne peux pas modifier la LONGUEUR de la page $key_value (fixé à 8 ? ??) et la LONGUEUR de la sortie $encrypted_text ? (ne peut-elle pas être plus longue de 32, 64 ou autre ? ??)

3 votes

@ Le résultat du cryptage est une donnée binaire. Si vous souhaitez qu'elles soient lisibles par l'homme, utilisez le codage base64 ou hexadécimal. Je ne peux pas changer la longueur de la valeur de la clé ? Les différents algorithmes de cryptage symétrique ont des exigences différentes pour la valeur de la clé. et la LONGUEUR de la sortie... La longueur du texte crypté doit être au moins aussi longue que le texte original, sinon il n'y a pas assez d'informations pour recréer le texte original. (Il s'agit d'une application du principe du pigeon.) Par ailleurs, vous devriez utiliser AES au lieu de DES. Le DES est facilement cassable et n'est plus sûr.

0 votes

Commentaire référant 2) si les données sont vraiment sensibles : pouvez-vous lier une bibliothèque cryptographique ? quels sont les services auxquels je peux "envoyer la responsabilité" ? J'ai fait des recherches sur Google, mais il semble que je n'arrive pas à trouver les bons mots clés pour obtenir de bons résultats.

1voto

Yash Points 51

En PHP, le cryptage et le décryptage d'une chaîne de caractères est possible en utilisant une des extensions de cryptographie appelée fonction OpenSSL pour le cryptage et le décryptage.

Fonction openssl_encrypt() : La fonction openssl_encrypt() est utilisée pour crypter les données.

La syntaxe est la suivante :

string openssl_encrypt( string $data, string $method, string $key, $options = 0, string $iv, string $tag= NULL, string $aad, int $tag_length = 16 )

Les paramètres sont les suivants :

$data : Il contient la chaîne ou les données qui doivent être cryptées.

$method : La méthode de chiffrement est adoptée à l'aide de la fonction openssl_get_cipher_methods().

Clé : Il contient la clé de cryptage.

$options : Il contient la disjonction bit à bit des indicateurs OPENSSL_RAW_DATA et OPENSSL_ZERO_PADDING.

$iv : Il contient le vecteur d'initialisation qui n'est pas NULL.

$tag : Il contient la balise d'authentification qui est passée par référence lors de l'utilisation du mode de chiffrement AEAD (GCM ou CCM).

$aad : Il contient les données d'authentification supplémentaires.

$tag_length : Il contient la longueur de la balise d'authentification. La longueur de la balise d'authentification est comprise entre 4 et 16 pour le mode GCM.

Valeur de retour : Il renvoie la chaîne cryptée en cas de succès ou FALSE en cas d'échec.

Fonction openssl_decrypt() La fonction openssl_decrypt() est utilisée pour décrypter les données.

La syntaxe est la suivante :

string openssl_decrypt( string $data, string $method, string $key, int $options = 0, string $iv, string $tag, string $aad)

Les paramètres sont les suivants :

$data : Il contient la chaîne ou les données qui doivent être cryptées.

$method : La méthode de chiffrement est adoptée à l'aide de la fonction openssl_get_cipher_methods().

Clé : Il contient la clé de cryptage.

$options : Il contient la disjonction bit à bit des indicateurs OPENSSL_RAW_DATA et OPENSSL_ZERO_PADDING.

$iv : Il contient le vecteur d'initialisation qui n'est pas NULL.

$tag : Il contient la balise d'authentification utilisant le mode de chiffrement AEAD (GCM ou CCM). Lorsque l'authentification échoue, openssl_decrypt() renvoie FALSE.

$aad : Il contient les données d'authentification supplémentaires.

Valeur de retour : Il renvoie la chaîne décryptée en cas de succès ou FALSE en cas d'échec.

Approche : Tout d'abord, déclarer une chaîne de caractères et la stocker dans une variable, puis utiliser la fonction openssl_encrypt() pour crypter la chaîne donnée et utiliser la fonction openssl_decrypt() pour la décrypter.

Vous pouvez trouver les exemples à l'adresse suivante : https://www.geeksforgeeks.org/how-to-encrypt-and-decrypt-a-php-string/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X