L'extension mcrypt est obsolète sera supprimée dans PHP 7.2 selon le commentaire publié ici . Je recherche donc une autre façon de crypter les mots de passe.
En ce moment, j'utilise quelque chose comme
mcrypt_encrypt(MCRYPT_RIJNDAEL_128, md5($key, true), $string, MCRYPT_MODE_CBC, $iv)
J'ai besoin de votre avis pour le meilleur / le plus fort moyen de crypter les mots de passe, le mot de passe crypté doit bien sûr être pris en charge par PHP 7.xx et doit également être décryptable car mes clients veulent avoir une option pour `` récupérer '' leurs mots de passe sans générer de nouveau une.
password_hash
et les vérifier avecpassword_verify
?Réponses:
Il est recommandé de hacher les mots de passe afin qu'ils ne soient pas déchiffrables. Cela rend les choses légèrement plus difficiles pour les attaquants qui peuvent avoir eu accès à votre base de données ou à vos fichiers.
Si vous devez crypter vos données et les faire déchiffrer, un guide de cryptage / décryptage sécurisé est disponible sur https://paragonie.com/white-paper/2015-secure-php-data-encryption . Pour résumer ce lien:
la source
Sodium-compat
( github.com/paragonie/sodium_compat ) qui fonctionne en PHP> = 5.2.4Comme suggéré par @rqLizard , vous pouvez utiliser les fonctions
openssl_encrypt
/openssl_decrypt
PHP à la place, ce qui offre une bien meilleure alternative pour implémenter AES (The Advanced Encryption Standard) également connu sous le nom de cryptage Rijndael.Selon le commentaire suivant de Scott sur php.net :
Lectures complémentaires:
Exemples de code
Exemple 1
Exemple # 2
Exemple # 3
Sur la base des exemples ci-dessus, j'ai changé le code suivant qui vise à chiffrer l'ID de session de l'utilisateur:
dans:
Pour clarifier, le changement ci-dessus n'est pas une vraie conversion car les deux cryptages utilisent une taille de bloc différente et des données cryptées différentes. En outre, le remplissage par défaut est différent,
MCRYPT_RIJNDAEL
prend uniquement en charge le remplissage nul non standard. @zaphNotes supplémentaires (à partir des commentaires de @ zaph):
MCRYPT_RIJNDAEL_128
) est équivalent à AES , cependant Rijndael 256 (MCRYPT_RIJNDAEL_256
) n'est pas AES-256 car le 256 spécifie une taille de bloc de 256 bits, alors qu'AES n'a qu'une taille de bloc: 128 bits. Donc, fondamentalement, Rijndael avec une taille de bloc de 256 bits (MCRYPT_RIJNDAEL_256
) a été nommé à tort en raison des choix des développeurs mcrypt . @zaphLe chiffrement avec différentes tailles de bloc pour Rijndael produit différentes données chiffrées.
Par exemple,
MCRYPT_RIJNDAEL_256
(pas équivalent àAES-256
) définit une variante différente du chiffrement par blocs Rijndael avec une taille de 256 bits et une taille de clé basée sur la clé transmise, oùaes-256-cbc
est Rijndael avec une taille de bloc de 128 bits avec une taille de clé de 256 bits. Par conséquent, ils utilisent des tailles de bloc différentes qui produisent des données chiffrées entièrement différentes car mcrypt utilise le nombre pour spécifier la taille de bloc, où OpenSSL a utilisé le nombre pour spécifier la taille de la clé (AES n'a qu'une taille de bloc de 128 bits). Donc, fondamentalement, AES est Rijndael avec une taille de bloc de 128 bits et des tailles de clé de 128, 192 et 256 bits. Par conséquent, il est préférable d'utiliser AES, qui s'appelle Rijndael 128 dans OpenSSL.la source
$session_id = rtrim($decryptedSessionId, "\0");
? Est-il possibleopenssl_decrypt
de renvoyer des caractères indésirables à la fin? Que faire si la variable chiffrée se termine par 0 (c'estencrypt("abc0")
-à- dire ?"\0"
n'est pas"0"
mais le caractère NULL, dont le code ASCII est 0x00 (hexadécimal 0).L'implémentation Pure-PHP de Rijndael existe avec phpseclib disponible en tant que package composer et fonctionne sur PHP 7.3 (testé par moi).
Il y a une page sur la documentation phpseclib, qui génère un exemple de code après avoir entré les variables de base (chiffrement, mode, taille de clé, taille de bit). Il génère les éléments suivants pour Rijndael, ECB, 256, 256:
un code avec mycrypt
fonctionne comme ça avec la bibliothèque
*
$term
étaitbase64_decoded
la source
Comme détaillé par d'autres réponses ici, la meilleure solution que j'ai trouvée est d'utiliser OpenSSL. Il est intégré à PHP et vous n'avez besoin d'aucune bibliothèque externe. Voici des exemples simples:
Pour crypter:
Pour décrypter:
Lien de référence: https://www.shift8web.ca/2017/04/how-to-encrypt-and-execute-your-php-code-with-mcrypt/
la source
Vous pouvez utiliser le package phpseclib pollyfill. Vous ne pouvez pas utiliser open ssl ou libsodium pour crypter / décrypter avec rijndael 256. Autre problème, vous n'avez pas besoin de remplacer le code.
la source
mcrypt_compat
en exécutantcomposer require phpseclib/mcrypt_compat
mais j'obtiens toujours quePHP Fatal error: Uncaught Error: Call to undefined function mcrypt_get_key_size() in /app/kohana/classes/Kohana/Encrypt.php:124
j'utilise le7.2.26
framwork php et Kohana. Y a-t-il d'autres étapes à effectuer après son installation avec composer?require APPPATH . '/vendor/autoload.php';
au bas debootstrap.php
.Vous devriez utiliser OpenSSL plus
mcrypt
car il est activement développé et maintenu. Il offre une meilleure sécurité, maintenabilité et portabilité. Deuxièmement, il effectue le cryptage / décryptage AES beaucoup plus rapidement. Il utilise le remplissage PKCS7 par défaut, mais vous pouvez spécifierOPENSSL_ZERO_PADDING
si vous en avez besoin. Pour utiliser avec une clé binaire de 32 octets, vous pouvez spécifieraes-256-cbc
ce qui est beaucoup plus évident queMCRYPT_RIJNDAEL_128
.Voici l'exemple de code utilisant Mcrypt:
Et voici la version écrite en utilisant OpenSSL:
Source: Si vous tapez le mot MCRYPT dans votre code PHP, vous le faites mal .
la source
J'utilise ceci sur PHP 7.2.x, cela fonctionne bien pour moi:
puis authentifiez le hachage avec la fonction suivante:
Exemple:
et pour authentifier ce hachage, utilisez le code suivant:
C'est tout.
la source
Comme indiqué, vous ne devez pas stocker les mots de passe de vos utilisateurs dans un format décryptable. Le cryptage réversible permet aux pirates de trouver facilement les mots de passe de vos utilisateurs, ce qui va jusqu'à mettre en danger les comptes de vos utilisateurs sur d'autres sites s'ils utilisent le même mot de passe.
PHP fournit une paire de fonctions puissantes pour le chiffrement de hachage unidirectionnel à sel aléatoire -
password_hash()
etpassword_verify()
. Étant donné que le hachage est automatiquement salé de manière aléatoire, il n'y a aucun moyen pour les pirates d'utiliser des tables précompilées de hachages de mots de passe pour rétroconcevoir le mot de passe. Définissez l'PASSWORD_DEFAULT
option et les futures versions de PHP utiliseront automatiquement des algorithmes plus puissants pour générer des hachages de mots de passe sans que vous ayez à mettre à jour votre code.la source
Vous devez utiliser la
openssl_encrypt()
fonction.la source
J'ai pu traduire mon objet Crypto
Obtenez une copie de php avec mcrypt pour décrypter les anciennes données. Je suis allé sur http://php.net/get/php-7.1.12.tar.gz/from/a/mirror , je l'ai compilé, puis j'ai ajouté l'extension ext / mcrypt (configure; make; make install). Je pense que j'ai dû ajouter la ligne extenstion = mcrypt.so au php.ini également. Une série de scripts pour créer des versions intermédiaires des données avec toutes les données non chiffrées.
Créer une clé publique et privée pour openssl
Pour crypter (à l'aide de la clé publique), utilisez openssl_seal. D'après ce que j'ai lu, openssl_encrypt utilisant une clé RSA est limité à 11 octets de moins que la longueur de la clé (voir http://php.net/manual/en/function.openssl-public-encrypt.php commentaire de Thomas Horsten)
Vous pourriez probablement stocker le binaire brut.
Pour déchiffrer (à l'aide de la clé privée)
PS Vous ne pouvez pas crypter la chaîne vide ("")
PPS Ceci est pour une base de données de mots de passe et non pour la validation de l'utilisateur.
la source