L'utilisation d'un Vecteur d'Initialisation dans openssl_encrypt
J'ai eu un coup d'oeil à cette question, et je voulais le faire pour moi-même. Quand j'ai couru ce code (pris directement à partir 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
J'ai donc eu un coup d'oeil à la docs, mais il "n'est pas de documentation". J'ai trouvé ce commentaire, mais toujours pas de mention de ce que le Vecteur d'Initialisation doit être et comment je dois l'utiliser. Quelqu'un peut-il m'éclairer?
Je sais que je pourrait avoir fait un peu plus Googleing, mais Stackoverflow vient en premier dans de nombreux résultats de recherche j'ai pensé que cette question pourrait être utile à quelqu'un d'autre qui a avoir ce problème.
- Avez-vous recherche de ce que vecteur d'initialisation signifie?
- Oui, mais je me demandais comment cela devrait être mieux mis en œuvre dans PHP.
- Un vide IV est mauvais. C'est ce qui a conduit à l'ensemble de Debian/OpenSSH fiasco a tout à l'arrière.
- À essayer: php.net/manual/en/function.openssl-encrypt.php#99188 Voir le dernier argument,
$iv
. - oui, comme je l'ai dit, j'ai lu les docs. Il n'a pas vraiment rien révéler sur le problème que je me pose.
- EDIT: Oups, vient de réaliser que vous avez déjà lié à trop. Vous êtes à la recherche pour ce type de valeur à transmettre en tant que
$iv
? - A noter également,
$iv
est relativement nouveau (v. 5.3.3), donc je suis sûr que certains anciens manifestations pourraient être hors de date/obsolète. - oui, c'est ce que je vous demande. J'aurais dû être plus clair 🙂
- Eh bien, voici quelque chose d'une manifestation unique: bugs.php.net/bug.php?id=60798 Et voici un autre à l'aide de
openssl_random_pseudo_bytes(openssl_cipher_iv_length($method))
et$method = 'aes-128-ecb'
. - Quelqu'un d'autre mentionné dans un commentaire sur l'une des réponses, mais votre problème le plus immédiat est que le Vecteur d'Initialisation (vous êtes à l'aide de '1234567812345678') est censé être le 4ème paramètre de openssl_encrypt(), pas le troisième. Vous avez besoin de passer une valeur de 0 pour les options. De même pour l'inclure lorsque vous appelez openssl_decrypt().
Vous devez vous connecter pour publier un commentaire.
Un IV est généralement un nombre aléatoire qui garantit le texte chiffré est unique.
Pour expliquer pourquoi il est nécessaire, faites semblant de croire que nous avons une base de données de noms de personnes chiffré avec la clé "secrète" et IV.
Si Jean 1 sait que son texte chiffré (dsfa9p8y098hasdf) et a accès à l'autre de chiffrement de textes, il peut facilement trouver d'autres personnes qui s'appelait Jean.
Maintenant, dans la réalité, un mode de cryptage qui nécessite un IV sera toujours en utiliser un. Si vous ne spécifiez pas de IV, il est automatiquement définie sur un tas d'octets nuls. Imaginez le premier exemple, mais avec une constante IV (00000000).
Pour éviter le recours répété à de chiffrement de textes, nous pouvons chiffrer les noms à l'aide de la même "secret" de la clé et aléatoire IV:
Comme vous pouvez le voir, les deux "Jean" cipher les textes sont maintenant différentes. Chaque IV est unique et a influencé le processus de chiffrement de rendre le résultat final unique. Jean 1 a maintenant aucune idée de ce que l'utilisateur 3 nom de l'.
Déchiffrement nécessite l'utilisation du même IV, le texte a été chiffré avec bien sûr, c'est pourquoi il doit être stocké dans la base de données. Le IV est d'aucune utilité sans la clé afin de transmission ou de stockage avec le texte chiffré est d'aucun intérêt.
C'est un peu trop simpliste exemple, mais la vérité est, de ne pas utiliser IV du a de graves ramifications de sécurité.
Maintenant votre code semble être le réglage de la IV (1234567812345678), mais ne l'utilisez pas sur le déchiffrement. Qui est vouée à l'échec.
Vous pouvez aussi utiliser de PHP IV fonctions de génération. Je pense que cela devrait fonctionner pour vous:
Pour le stockage/transmission, vous pouvez simplement concaténer le IV et le texte chiffré comme suit:
Puis sur la récupération, tirez le IV pour le décryptage:
Pour plus d'informations, consultez PHP Mcrypt de la bibliothèque. Il est très complet et a des tonnes d'exemples, de nombreuses qui peuvent vous aider avec openssh cryptage des implémentations.
http://php.net/manual/en/function.mcrypt-encrypt.php
mysql_real_escape_string()
(bien que bientôt être amortis).mcrypt_create_iv
) comme un pari assez sûr.openssl_random_pseudo_bytes()
, alors je n'ai pas vraiment besoin d'univ
, est-ce correct?MCRYPT_RIJNDAEL_128