Utilisation du vecteur D'initialisation dans le cryptage openssl

j'ai regardé cette question , et j'ai voulu le faire pour moi-même. Quand j'ai lancé ce code (tiré directement de cette réponse ):

$textToEncrypt = "My super secret information.";
$encryptionMethod = "AES-256-CBC";  // AES is used by the U.S. gov't to encrypt top secret documents.
$secretHash = "25c6c7ff35b9979b151f2136cd13b0ff";

//To encrypt
$encryptedMessage = openssl_encrypt($textToEncrypt, $encryptionMethod, $secretHash, '1234567812345678');

//To Decrypt
$decryptedMessage = openssl_decrypt($encryptedMessage, $encryptionMethod, $secretHash);

//Result
echo "Encrypted: $encryptedMessage <br>Decrypted: $decryptedMessage";

mais j'ai l'avertissement

openssl_encrypt(): Using an empty Initialization Vector (iv) is potentially insecure and not recommended

alors je suis allé jeter un oeil au docs , mais il "n'y a pas de documentation". J'ai trouvé ce commentaire , mais toujours pas de mention de ce que le vecteur D'initialisation devrait être et comment je dois l'utiliser. Quelqu'un peut-il m'éclairer?

je sais que j'aurais pu faire un peu plus de recherche sur Google, mais Stackoverflow apparaît en premier dans tant de résultats de recherche que j'ai pensé que cette question pourrait être utile à n'importe qui d'autre qui avait ce problème.

62
demandé sur Community 2012-08-06 04:06:18

1 réponses

un IV est généralement un nombre aléatoire qui garantit que le texte crypté est unique.

pour expliquer pourquoi c'est nécessaire, faisons comme si nous avions une base de données des noms des gens cryptée avec la clé "secret" et non IV.

1 John dsfa9p8y098hasdf
2 Paul po43pokdfgpo3k4y
3 John dsfa9p8y098hasdf

si Jean 1 connaît son texte codé (dsfa9p8y098hasdf) et a accès aux autres textes codés, il peut facilement trouver D'autres personnes nommées Jean.

maintenant dans la réalité, un mode de cryptage qui nécessite une perfusion en utilisera toujours une. Si vous ne spécifiez pas un IV, il est automatiquement défini à un tas d'octets null. Imaginez le premier exemple mais avec une constante IV (00000000).

1 John dsfa9p8y098hasdf 00000000
2 Paul po43pokdfgpo3k4y 00000000
3 John dsfa9p8y098hasdf 00000000

pour empêcher les textes de chiffrement répétés, nous pouvons chiffrer les noms en utilisant la même clé "secrète" et des IV aléatoires:

1 John sdf875n90mh28458 45gh3546
2 Paul fg9087n5b60987nf 56897ngq
3 John gjhn0m89456vnler 8907345f

comme vous pouvez le voir, les deux textes codés 'John' sont maintenant différents. Chaque IV est unique et a influencé le processus de cryptage résultat final unique. John 1 n'a maintenant aucune idée du nom de l'utilisateur 3.

le déchiffrement nécessite L'utilisation du même IV que le texte a été crypté bien sûr, c'est pourquoi il doit être stocké dans la base de données. L'IV n'est d'aucune utilité sans la clé donc la transmission ou le stockage avec le texte crypté ne pose pas de problème.

c'est un exemple trop simpliste, mais la vérité est, ne pas utiliser IV A de sérieuses ramifications de sécurité.


maintenant votre code semble définir le IV (1234567812345678) mais ne pas l'utiliser sur le déchiffrement. Qui est vouée à l'échec.

vous pouvez également vouloir utiliser certaines des fonctions de génération IV de PHP. Je pense que cela devrait fonctionner pour vous:

$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$encryptedMessage = openssl_encrypt($textToEncrypt, $encryptionMethod, $secretHash, 0, $iv);
$decryptedMessage = openssl_decrypt($encryptedMessage, $encryptionMethod, $secretHash, 0, $iv);

pour le stockage / transmission, vous pouvez simplement concaténer le texte IV et cipher comme suit:

$data = $iv.$encryptedMessage;

ensuite, lors de la récupération, retirez L'IV pour décryptage:

$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = substr($data, 0, $iv_size);
$decryptedMessage = openssl_decrypt(substr($data, $iv_size), $encryptionMethod, $secretHash, 0, $iv);

pour plus d'informations, consultez la bibliothèque mcrypt de PHP. Il est très complet et a des tonnes d'exemples, dont beaucoup peuvent vous aider avec les implémentations de cryptage openssh. http://php.net/manual/en/function.mcrypt-encrypt.php

113
répondu Joel Mellon 2016-07-26 15:04:38