web-dev-qa-db-fra.com

Bonne façon d'utiliser php openssl_encrypt

Je travaille avec la cryptographie sur un projet et j'ai besoin d'un peu d'aide sur la façon de travailler avec openssl_encrypt Et openssl_decrypt, Je veux juste connaître la manière la plus simple et la plus correcte de le faire. Voici ce que j'ai obtenu jusqu'à présent:

// To encrypt a string

$dataToEncrypt = 'Hello World';

$cypherMethod = 'AES-256-CBC';
$key = random_bytes(32);
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length($cypherMethod));

$encryptedData = openssl_encrypt($dataToEncrypt, $cypherMethod, $key, $options=0, $iv);

Je stocke ensuite $cypherMethod, $key Et $iv Pour les utiliser lors du décryptage du $encryptedData. (Ne précisons pas comment je stocke les valeurs, merci!)

// To decrypt an encrypted string

$decryptedData = openssl_decrypt($encryptedData, $cypherMethod, $key, $options=0, $iv);

Tout d'abord, l'exemple de code ci-dessus est-il un exemple correct de la façon d'utiliser php openssl_encrypt?

Deuxièmement, ma méthode pour générer les $key Et $iv Est-elle correcte et sécurisée? Parce que je continue de lire, les clés doivent être sécurisées cryptographiquement.

Enfin, une valeur de 32-byte N'est-elle pas requise pour AES-256-CBC? Si oui, alors pourquoi est-ce que openssl_cipher_iv_length() ne renvoie que int(16) comme longueur? Cela ne devrait-il pas être int(32)?

7
Jo E.

Tout d'abord, l'exemple de code ci-dessus est-il un exemple correct de la façon d'utiliser php openssl_encrypt?

Votre utilisation de la fonction semble correcte, mais vous pouvez envisager un mode de fonctionnement autre que CBC. CBC est difficile à obtenir car le cryptage des données dans ce mode a connu des attaques contre lui, telles que l'infâme attaque CBC à retournement de bits , qui permet à un attaquant d'apporter des modifications significatives au texte en clair en modifiant le texte chiffré. Si possible, j'utiliserais un mode de chiffrement authentifié comme GCM si vous le pouvez (ressemble à il est pris en charge dans PHP 7.1+ (exemple # 1) ).

Si vous utilisez le mode CBC, jetez un œil à Exemple # 2 dans la documentation . Notez qu'après le cryptage, un MAC (code d'authentification de message) est calculé sur le texte chiffré et stocké. Ce MAC doit être recalculé avant de décrypter le texte chiffré, et s'il ne correspond pas au MAC stocké, le texte chiffré a été modifié et n'est pas valide.

Deuxièmement, ma méthode pour générer la clé $ et $ iv est-elle correcte et sécurisée? Parce que je continue de lire, les clés doivent être sécurisées cryptographiquement.

Les clés doivent être générées à l'aide d'un générateur de nombres aléatoires cryptographiquement sécurisé. Heureusement, la plupart des systèmes d'exploitation en fournissent un prêt à l'emploi via /dev/urandom. Cette réponse explique bien comment lire à partir de /dev/urandom en PHP. openssl_random_pseudo_bytes devrait également être cryptographiquement sécurisé mais il y a fois où ce n'est pas le cas .

Les vecteurs d'initialisation (IV) doivent être aléatoires et ne doivent jamais être réutilisés avec la même clé.

Enfin, une valeur de 32 octets n'est-elle pas requise pour AES-256-CBC? Si oui, alors pourquoi est-ce que openssl_cipher_iv_length () renvoie uniquement int (16) comme longueur? Cela ne devrait-il pas être int (32)?

AES est un chiffrement par blocs qui fonctionne sur des blocs de 128 bits (16 octets), quelle que soit la taille de la clé.

4
puzzlepalace