Ce que je veux dire est:
Original String + Salt or Key --> Encrypted String
Encrypted String + Salt or Key --> Decrypted (Original String)
Peut-être quelque chose comme:
"hello world!" + "ABCD1234" --> Encrypt --> "2a2ffa8f13220befbe30819047e23b2c" (may be, for e.g)
"2a2ffa8f13220befbe30819047e23b2c" --> Decrypt with "ABCD1234" --> "hello world!"
- En PHP, comment pouvez-vous faire cela?
Tentative d'utilisation Crypt_Blowfish
, mais cela n'a pas fonctionné pour moi.
Réponses:
Avant de faire quoi que ce soit d'autre, cherchez à comprendre la différence entre le cryptage et l' authentification , et pourquoi vous voulez probablement un cryptage authentifié plutôt qu'un simple cryptage .
Pour implémenter le cryptage authentifié, vous souhaitez crypter puis MAC. L'ordre de chiffrement et d'authentification est très important! L'une des réponses existantes à cette question a fait cette erreur; comme le font de nombreuses bibliothèques de cryptographie écrites en PHP.
Vous devez éviter d'implémenter votre propre cryptographie et utiliser à la place une bibliothèque sécurisée écrite et révisée par des experts en cryptographie.
Utilisez libsodium si vous avez un accès PECL (ou sodium_compat si vous voulez libsodium sans PECL); sinon ...
Utilisez le cryptage de désamorçage / php ; ne lancez pas votre propre cryptographie!
Les deux bibliothèques liées ci-dessus facilitent et simplifient l'implémentation du chiffrement authentifié dans vos propres bibliothèques.
Si vous souhaitez toujours écrire et déployer votre propre bibliothèque de cryptographie, contrairement à la sagesse conventionnelle de tous les experts en cryptographie sur Internet, voici les étapes à suivre.
Chiffrement:
Décryptage:
hash_equals()
. S'il échoue, abandonnez.Autres considérations de conception:
mb_strlen()
et d'mb_substr()
utiliser le'8bit'
mode de jeu de caractères pour éviter lesmbstring.func_overload
problèmes.mcrypt_create_iv()
, NE PAS UTILISERMCRYPT_RAND
!bin2hex()
,base64_encode()
Etc. peut entraîner une fuite d' informations sur vos clés de chiffrement via synchronisation du cache. Évitez-les si possible.Même si vous suivez les conseils donnés ici, beaucoup de choses peuvent mal tourner avec la cryptographie. Demandez toujours à un expert en cryptographie d'examiner votre implémentation. Si vous n'avez pas la chance d'être des amis personnels avec un étudiant en cryptographie de votre université locale, vous pouvez toujours essayer le forum Cryptography Stack Exchange pour obtenir des conseils.
Si vous avez besoin d'une analyse professionnelle de votre implémentation, vous pouvez toujours embaucher une équipe réputée de consultants en sécurité pour revoir votre code de cryptographie PHP (divulgation: mon employeur).
Important: quand ne pas utiliser le chiffrement
Ne cryptez pas les mots de passe . Vous souhaitez les hacher à la place, en utilisant l'un de ces algorithmes de hachage de mot de passe:
N'utilisez jamais une fonction de hachage à usage général (MD5, SHA256) pour le stockage des mots de passe.
Ne cryptez pas les paramètres d'URL . Ce n'est pas le bon outil pour le travail.
Exemple de chiffrement de chaîne PHP avec Libsodium
Si vous êtes sur PHP <7.2 ou si vous n'avez pas installé libsodium, vous pouvez utiliser sodium_compat pour obtenir le même résultat (quoique plus lentement).
Puis pour le tester:
Halite - Libsodium simplifié
L'un des projets sur lesquels j'ai travaillé est une bibliothèque de cryptage appelée Halite , qui vise à rendre libsodium plus facile et plus intuitif.
Toute la cryptographie sous-jacente est gérée par libsodium.
Exemple avec désamorçage / cryptage php
Remarque :
Crypto::encrypt()
renvoie une sortie codée hexadécimale.Gestion des clés de chiffrement
Si vous êtes tenté d'utiliser un "mot de passe", arrêtez tout de suite. Vous avez besoin d'une clé de cryptage aléatoire de 128 bits, et non d'un mot de passe mémorable humain.
Vous pouvez stocker une clé de chiffrement pour une utilisation à long terme comme ceci:
Et, à la demande, vous pouvez le récupérer comme suit:
Je recommande fortement de simplement stocker une clé générée de manière aléatoire pour une utilisation à long terme au lieu de tout type de mot de passe comme clé (ou pour dériver la clé).
Si vous utilisez la bibliothèque de Defuse:
$string = $keyObject->saveToAsciiSafeString()
$loaded = Key::loadFromAsciiSafeString($string);
"Mais je veux vraiment utiliser un mot de passe."
C'est une mauvaise idée, mais d'accord, voici comment le faire en toute sécurité.
Tout d'abord, générez une clé aléatoire et stockez-la dans une constante.
Notez que vous ajoutez du travail supplémentaire et que vous pouvez simplement utiliser cette constante comme clé et vous épargner beaucoup de chagrin d'amour!
Utilisez ensuite PBKDF2 (comme cela) pour dériver une clé de chiffrement appropriée de votre mot de passe plutôt que de chiffrer directement avec votre mot de passe.
N'utilisez pas seulement un mot de passe à 16 caractères. Votre clé de cryptage sera cassée de façon comique.
la source
password_hash()
et vérifiez-les avecpassword_verify()
.function getKeyFromPassword($password, $keysize = \Sodium\CRYPTO_SECRETBOX_KEYBYTES)
Je suis en retard à la fête, mais en cherchant la bonne façon de le faire, je suis tombé sur cette page, c'était l'un des meilleurs résultats de recherche Google, donc j'aimerais partager mon avis sur le problème, que je considère comme étant à jour au moment de la rédaction de cet article (début 2017). A partir de PHP 7.1.0, le
mcrypt_decrypt
etmcrypt_encrypt
va être obsolète, donc la construction d'un code à l'épreuve du temps devrait utiliser openssl_encrypt et openssl_decryptVous pouvez faire quelque chose comme:
Vous pouvez également utiliser d'autres méthodes de déchiquetage, en fonction de vos besoins en matière de sécurité. Pour connaître les méthodes de déchiquetage disponibles, consultez la fonction openssl_get_cipher_methods .
la source
prod_id=123
mais je ne veux tout simplement pas rendre 123 lisible pour tout le monde, mais même s'ils pouvaient le lire, ce ne serait pas un problème. Un attaquant pouvant remplacer le 123 par une valeur personnalisée ne causera aucun dommage, il / elle ne pourra obtenir des détails que sur tout autre produit, mais Joe Average User n'aura aucune idée sur la manière d'obtenir des détails pour produit 124 par exemple. Pour un scénario comme celui-ci, c'est une solution parfaite, pour la sécurité, c'est non!Ce qu'il ne faut pas faire
Je l'ai sur moi. En fait, j'ai trouvé une réponse sur Google et j'ai juste modifié quelque chose. Le résultat est cependant complètement incertain.
la source
base64_encode(encrypt($string))
- Pour les décrypter:decrypt(base64_decode($encrypted))
mcrypt_encrypt
remplaçant l'exemple de code de : php.net/manual/en/function.mcrypt-encrypt.php . Notez que le réviser maintenant devrait probablement avoir unrtrim
caractère for"\0"
à la fin.Pour le framework Laravel
Si vous utilisez le framework Laravel, il est plus facile de crypter et décrypter avec des fonctions internes.
la source
Actualisé
Version prête pour PHP 7. Il utilise la fonction openssl_encrypt de la bibliothèque PHP OpenSSL .
la source
J'ai laissé cette réponse à des fins historiques - mais certaines méthodes sont désormais obsolètes, la méthode de cryptage DES n'est pas une pratique recommandée, etc.
Je n'ai pas mis à jour ce code pour deux raisons: 1) je ne travaille plus à la main avec les méthodes de chiffrement en PHP, et 2) ce code remplit toujours le but pour lequel il était destiné: démontrer le concept minimal et simpliste du fonctionnement du chiffrement en PHP.
Si vous trouvez une source de type "cryptage PHP pour les nuls" tout aussi simpliste qui peut faire démarrer les gens dans 10 à 20 lignes de code ou moins, faites-le moi savoir dans les commentaires.
Au-delà de cela, profitez de cet épisode classique de la réponse de chiffrement minimaliste PHP4 de la première époque.
Idéalement, vous avez - ou pouvez avoir - accès à la bibliothèque PHP mcrypt, car elle est certainement populaire et très utile pour une variété de tâches. Voici un aperçu des différents types de cryptage et quelques exemples de code: Techniques de cryptage en PHP
Quelques avertissements:
1) N'utilisez jamais de chiffrement réversible ou "symétrique" lorsqu'un hachage unidirectionnel fera l'affaire.
2) Si les données sont vraiment sensibles, comme les numéros de carte de crédit ou de sécurité sociale, arrêtez; vous avez besoin de plus que n'importe quel morceau de code simple, mais vous avez plutôt besoin d'une bibliothèque de chiffrement conçue à cet effet et d'un temps considérable pour rechercher les méthodes nécessaires. De plus, la cryptographie logicielle représente probablement <10% de la sécurité des données sensibles. C'est comme recâbler une centrale nucléaire - acceptez que la tâche soit dangereuse et difficile et au-delà de vos connaissances si c'est le cas. Les sanctions financières peuvent être immenses, il vaut donc mieux utiliser un service et leur assumer la responsabilité.
3) Tout type de cryptage facilement implémentable, tel qu'énuméré ici, peut raisonnablement protéger les informations moyennement importantes que vous souhaitez garder à l'abri des regards indiscrets ou limiter l'exposition en cas de fuite accidentelle / intentionnelle. Mais vu comment la clé est stockée en texte brut sur le serveur Web, s'ils peuvent obtenir les données, ils peuvent obtenir la clé de déchiffrement.
Quoi qu'il en soit, amusez-vous :)
la source
M�������f=�_=
des caractères étranges comme cryptés. Je ne peux pas obtenir de caractères simples? Comme:2a2ffa8f13220befbe30819047e23b2c
. De plus, ne puis-je pas changer la LONGUEUR de$key_value
(fixée à 8 ???) et la LONGUEUR de sortie$encrypted_text
? (ne peut-il pas être long de 32 ou 64 ou quoi que ce soit de plus ??)MCRYPT_RIJNDAEL_128
) et les textes chiffrés doivent être authentifiés (hash_hmac()
, vérifié avechash_equals()
).Si vous ne voulez pas utiliser la bibliothèque (que vous devriez), utilisez quelque chose comme ça (PHP 7):
la source
define("ENCRYPTION_KEY", "123456*"); $string = "This is the original data string!"; $encrypted = openssl_encrypt($string, 'BF-ECB', ENCRYPTION_KEY); $decrypted = openssl_decrypt($encrypted,'BF-ECB',ENCRYPTION_KEY);
Ce sont des méthodes compactes pour crypter / décrypter des chaînes avec PHP en utilisant AES256 CBC :
Usage:
la source
Le code ci-dessous fonctionne en php pour toutes les chaînes avec un caractère spécial
la source