PHP AES crypter / décrypter
J'ai trouvé un exemple pour fr/décodage des chaînes de caractères en PHP. Au premier abord il a l'air très bon, mais il l'habitude de travailler 🙁
Personne ne sait quel est le problème?
$Pass = "Passwort";
$Clear = "Klartext";
$crypted = fnEncrypt($Clear, $Pass);
echo "Encrypted: ".$crypted."</br>";
$newClear = fnDecrypt($crypted, $Pass);
echo "Decrypted: ".$newClear."</br>";
function fnEncrypt($sValue, $sSecretKey) {
return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $sSecretKey, $sDecrypted, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND))));
}
function fnDecrypt($sValue, $sSecretKey) {
return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $sSecretKey, base64_decode($sEncrypted), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)));
}
Le résultat est:
Chiffré: boKRNTYYNp7AiOvY1CidqsAn9wX4ufz/D9XrpjAOPk8=
Décrypté: —‚(ÑÁ ^ yË~F'¸®Ó–í œð2Á_B‰Â—
- La BCE est d'insécurité (donc de la SRC pour les protocoles de communication).
MCRYPT_RIJNDAEL_256
n'est pas AES. - Voici un bon exemple expliquant comment chiffrer/déchiffrer les données en PHP à l'aide de MCrypt de la Bibliothèque code-epicenter.com/how-to-use-mcrypt-library-in-php
- Voir aussi la mise à jour de ma bibliothèque de cryptage de Mcrypt pour OpenSSL, Remplacer Mcrypt avec OpenSSL et Préparer le retrait de Mcrypt en PHP 7.2
- Comme l'objet d'une réponse est considérée comme gravement mis à mal et d'insécurité, s'il vous plaît aller à la accepté de répondre à cette question.
Vous devez vous connecter pour publier un commentaire.
$sDecrypted
et$sEncrypted
sont pas définis dans votre code. Voir une solution qui fonctionne (mais n'est pas sécurisé!):ARRÊTER!
Mais il y a d'autres problèmes dans ce code, qui en font l'insécurité, en particulier l'utilisation de la BCE (qui n'est pas une de chiffrement mode, seulement un bloc de construction sur le dessus de laquelle les modes de chiffrement peut être définie). Voir Fab Sa réponse pour une solution rapide des problèmes les plus graves et Scott répondre pour savoir comment faire de ce droit.
encrypt
etdecrypt
fonctions n'a aucun sens. La seule raison pour laquelle cela fonctionne est que la BCE n'utilise pas un vecteur d'initialisation à tous, de sorte que toute valeur serait de faire et de produire le même résultat.Veuillez utiliser une sécurisé PHP bibliothèque de cryptage
C'est généralement une mauvaise idée d'écrire votre propre cryptographie, sauf si vous avez l'expérience de la rupture des autres peuples de la cryptographie implémentations.
Aucun des exemples ici authentifier le texte chiffré, ce qui les rend vulnérables à peu de réécriture attaques.
Si vous pouvez installer des extensions PECL, libsodium est encore mieux
Puis le tester:
Ceci peut être utilisé dans n'importe quelle situation où vous êtes de passage des données au client (par exemple chiffré des cookies de sessions sans côté serveur de stockage, chiffré des paramètres d'URL, etc.) avec un certain degré de certitude que l'utilisateur final ne peut pas déchiffrer ou de manière fiable la modifier.
Depuis libsodium est multi-plateforme, cela rend également plus facile de communiquer avec PHP, par exemple, des applets Java ou des applications mobiles natives.
Remarque: Si vous avez spécifiquement besoin d'ajouter chiffré cookies alimenté par libsodium à votre application, mon employeur Paragon Initiative Des Entreprises est le développement d'une bibliothèque appelée Halite qui s'occupe de tout pour vous.
Si vous ne voulez pas utiliser une lourde dépendance pour quelque chose résoluble en 15 lignes de code, utiliser le construit en OpenSSL fonctions. La plupart des PHP installations de venir avec OpenSSL, qui fournit rapide, compatible et sécurisé de cryptage AES en PHP. Eh bien, il est en sécurité tant que vous êtes en suivant les meilleures pratiques.
Le code suivant:
IV est une information publique et doit être aléatoire pour chaque message. Le hachage garantit que les données n'a pas été altéré.
Utilisation:
$iv
, tout en générant de lahash_hmac()
? Ne serait-il pas mieux de vérifier, que le nonce n'a pas été changé?hash_equals()
au lieu, comme il est vulnérable à l'attaque temporelle, plus d'informations iciPour plus d'informations
MCRYPT_MODE_ECB
ne pas utiliser le IV (vecteur d'initialisation). BCE mode de diviser votre message en blocs et chaque bloc est chiffré séparément. J'ai vraiment n'est pas recommandé.Mode CBC utilisation de l'IV pour faire de chaque message unique. CBC est recommandé et doit être utilisé à la place de la BCE.
Exemple :
Il faut avoir de la IV à décoder chaque message (IV sont pas secret). Chaque message est unique parce que chaque message a un unique IV.
aes256Key
. Cet exemple montre comment l'utiliser: php.net/manual/fr/book.mcrypt.php#107483mcrypt_encrypt
.Quelques choses importantes à noter avec le cryptage AES:
CBC
à la place.Si vous utilisez MCRYPT_RIJNDAEL_128, essayez
rtrim($output, "\0\3")
. Si la longueur de la chaîne est de moins de 16 ans, le décrypter la fonction renverra une chaîne d'une longueur de 16 caractères, ajout de 03 à la fin.Vous pouvez facilement vérifier cela, par exemple en essayant:
Si vous utilisez PHP >= 7.2 envisager l'utilisation intégrée de sodium extension du coeur pour encrption.
Trouver plus d'informations ici -
http://php.net/manual/en/intro.sodium.php
.C'est une solution de travail de
AES encryption
mises en œuvre à l'aide deopenssl
. Il utilise le Cipher Block Chaining Mode (Mode CBC). Ainsi, aux côtés dedata
etkey
, vous pouvez spécifieriv
etblock size
Exemple d'utilisation: