Je suis actuellement étudiant et j'étudie PHP, j'essaye de faire un simple chiffrement / déchiffrement de données en PHP. J'ai fait des recherches en ligne et certaines d'entre elles étaient assez déroutantes (du moins pour moi).
Voici ce que j'essaye de faire:
J'ai une table composée de ces champs (UserID, Fname, Lname, Email, Password)
Ce que je veux, c'est que tous les champs soient cryptés puis décryptés (est-il possible de les utiliser sha256
pour le cryptage / décryptage, si ce n'est un algorithme de cryptage)
Une autre chose que je veux apprendre est comment créer un sens unique hash(sha256)
combiné avec un bon "sel". (Fondamentalement, je veux juste avoir une implémentation simple de cryptage / décryptage, hash(sha256)+salt)
Monsieur / Madame, vos réponses seraient d'une grande aide et seraient très appréciées. Merci ++
la source
Réponses:
Préface
En commençant par la définition de votre table:
Voici les changements:
Fname
,Lname
etEmail
seront cryptés à l'aide d'un chiffrement symétrique, fourni par OpenSSL ,IV
champ stockera le vecteur d'initialisation utilisé pour le cryptage. Les exigences de stockage dépendent du chiffrement et du mode utilisés; plus à ce sujet plus tard.Password
champ sera haché à l'aide d'un hachage de mot de passe à sens unique,Chiffrement
Chiffre et mode
Le choix du meilleur chiffrement et du meilleur mode de chiffrement dépasse le cadre de cette réponse, mais le choix final affecte la taille de la clé de chiffrement et du vecteur d'initialisation; pour cet article, nous utiliserons AES-256-CBC qui a une taille de bloc fixe de 16 octets et une taille de clé de 16, 24 ou 32 octets.
Clé de cryptage
Une bonne clé de chiffrement est un objet blob binaire généré à partir d'un générateur de nombres aléatoires fiable. L'exemple suivant serait recommandé (> = 5.3):
Cela peut être fait une ou plusieurs fois (si vous souhaitez créer une chaîne de clés de chiffrement). Gardez-les aussi privés que possible.
IV
Le vecteur d'initialisation ajoute un caractère aléatoire au cryptage et est requis pour le mode CBC. Ces valeurs devraient idéalement être utilisées une seule fois (techniquement une fois par clé de chiffrement), de sorte qu'une mise à jour de n'importe quelle partie d'une ligne devrait la régénérer.
Une fonction est fournie pour vous aider à générer l'IV:
Exemple
Crypterons le champ de nom, en utilisant le précédent
$encryption_key
et$iv
; pour ce faire, nous devons remplir nos données à la taille du bloc:Exigences de stockage
La sortie cryptée, comme l'IV, est binaire; le stockage de ces valeurs dans une base de données peut être effectué en utilisant des types de colonnes désignés tels que
BINARY
ouVARBINARY
.La valeur de sortie, comme l'IV, est binaire; pour stocker ces valeurs dans MySQL, pensez à utiliser des colonnes
BINARY
ouVARBINARY
. Si ce n'est pas une option, vous pouvez également convertir les données binaires en une représentation textuelle à l'aide debase64_encode()
oubin2hex()
, cela nécessite entre 33% et 100% d'espace de stockage supplémentaire.Décryptage
Le déchiffrement des valeurs stockées est similaire:
Cryptage authentifié
Vous pouvez améliorer encore l'intégrité du texte chiffré généré en ajoutant une signature générée à partir d'une clé secrète (différente de la clé de chiffrement) et du texte chiffré. Avant que le texte chiffré ne soit déchiffré, la signature est d'abord vérifiée (de préférence avec une méthode de comparaison à temps constant).
Exemple
Voir également:
hash_equals()
Hashing
Le stockage d'un mot de passe réversible dans votre base de données doit être évité autant que possible; vous souhaitez uniquement vérifier le mot de passe plutôt que de connaître son contenu. Si un utilisateur perd son mot de passe, il est préférable de lui permettre de le réinitialiser plutôt que de lui envoyer son mot de passe d'origine (assurez-vous que la réinitialisation du mot de passe ne peut être effectuée que pour une durée limitée).
L'application d'une fonction de hachage est une opération unidirectionnelle; ensuite, il peut être utilisé en toute sécurité pour la vérification sans révéler les données originales; pour les mots de passe, une méthode de force brute est une approche réalisable pour le découvrir en raison de sa longueur relativement courte et des mauvais choix de mots de passe de nombreuses personnes.
Des algorithmes de hachage tels que MD5 ou SHA1 ont été créés pour vérifier le contenu du fichier par rapport à une valeur de hachage connue. Ils sont grandement optimisés pour rendre cette vérification aussi rapide que possible tout en restant précise. Compte tenu de leur espace de sortie relativement limité, il était facile de créer une base de données avec des mots de passe connus et leurs sorties de hachage respectives, les tables arc-en-ciel.
Ajouter un sel au mot de passe avant le hachage rendrait une table arc-en-ciel inutile, mais les récentes avancées matérielles ont fait des recherches par force brute une approche viable. C'est pourquoi vous avez besoin d'un algorithme de hachage délibérément lent et tout simplement impossible à optimiser. Il devrait également être en mesure d'augmenter la charge d'un matériel plus rapide sans affecter la capacité de vérifier les hachages de mots de passe existants pour le rendre à l'épreuve du temps.
Actuellement, il existe deux choix populaires disponibles:
Cette réponse utilisera un exemple avec bcrypt.
Génération
Un hachage de mot de passe peut être généré comme ceci:
Le sel est généré avec
openssl_random_pseudo_bytes()
pour former une goutte aléatoire de données qui est ensuite parcouruebase64_encode()
etstrtr()
pour correspondre à l'alphabet requis de[A-Za-z0-9/.]
.La
crypt()
fonction effectue le hachage en fonction de l'algorithme ($2y$
pour Blowfish), du facteur de coût (un facteur de 13 prend environ 0,40s sur une machine 3GHz) et du sel de 22 caractères.Validation
Une fois que vous avez récupéré la ligne contenant les informations utilisateur, vous validez le mot de passe de cette manière:
Pour vérifier un mot de passe, vous appelez à
crypt()
nouveau mais vous transmettez le hachage précédemment calculé comme valeur de sel. La valeur de retour donne le même hachage si le mot de passe donné correspond au hachage. Pour vérifier le hachage, il est souvent recommandé d'utiliser une fonction de comparaison à temps constant pour éviter les attaques de synchronisation.Hachage de mot de passe avec PHP 5.5
PHP 5.5 a introduit les fonctions de hachage de mot de passe que vous pouvez utiliser pour simplifier la méthode de hachage ci-dessus:
Et vérifier:
Voir aussi:
password_hash()
,password_verify()
la source
$iv_size = 16;
, j'utiliserais:$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length("AES-256-CBC"))
pour indiquer le lien entre la taille de iv à utiliser avec le chiffrement utilisé. Vous pouvez également développer un peu la nécessité (ou non) depkcs7_pad()
/pkcs7_unpad()
, ou simplement simplifier le message en vous en débarrassant et en utilisant "aes-256-ctr". Great post @ Ja͢ckJe pense que cela a déjà été répondu ... mais de toute façon, si vous voulez crypter / décrypter des données, vous ne pouvez pas utiliser SHA256
la source
Réponse Contexte et explication
Pour comprendre cette question, vous devez d'abord comprendre ce qu'est SHA256. SHA256 est une fonction de hachage cryptographique . Une fonction de hachage cryptographique est une fonction unidirectionnelle, dont la sortie est sécurisée par cryptographie. Cela signifie qu'il est facile de calculer un hachage (équivalent au chiffrement des données), mais difficile d'obtenir l'entrée d'origine en utilisant le hachage (équivalent au déchiffrement des données). Étant donné que l'utilisation d'une fonction de hachage cryptographique signifie que le décryptage est impossible sur le plan informatique, vous ne pouvez donc pas effectuer de décryptage avec SHA256.
Ce que vous souhaitez utiliser est une fonction bidirectionnelle, mais plus spécifiquement, un chiffrement par bloc . Une fonction qui permet à la fois le cryptage et le décryptage des données. Les fonctions
mcrypt_encrypt
etmcrypt_decrypt
par défaut utilisent l'algorithme Blowfish. L'utilisation de mcrypt par PHP peut être trouvée dans ce manuel . Une liste de définitions de chiffrement pour sélectionner le chiffrement utilisé par mcrypt existe également. Un wiki sur Blowfish peut être trouvé sur Wikipedia . Un chiffrement par bloc crypte l'entrée en blocs de taille et de position connues avec une clé connue, de sorte que les données puissent être déchiffrées ultérieurement à l'aide de la clé. C'est ce que SHA256 ne peut pas vous fournir.Code
la source
Voici un exemple utilisant openssl_encrypt
la source
mcrypt_create_iv()
, j'utiliserais:, deopenssl_random_pseudo_bytes(openssl_cipher_iv_length($encryptionMethod))
cette façon, la méthodologie fonctionne pour n'importe quelle valeur de $ encryptionMethod et utiliserait uniquement l'extension openssl.false
pouropenssl_decrypt()
. Voir stackoverflow.com/q/41952509/1066234 Étant donné que les chiffrements par blocs tels que AES exigent que les données d'entrée soient un multiple exact de la taille de bloc (16 octets pour AES), un remplissage est nécessaire.la source
Il m'a fallu un certain temps pour comprendre comment ne pas en avoir
false
lors de l'utilisationopenssl_decrypt()
et faire fonctionner le chiffrement et le déchiffrement.Si vous souhaitez transmettre la chaîne chiffrée via une URL, vous devez encoder l'URL de la chaîne:
Pour mieux comprendre ce qui se passe, lisez:
Pour générer des clés de 16 octets, vous pouvez utiliser:
Pour voir les messages d'erreur de openssl, vous pouvez utiliser:
echo openssl_error_string();
J'espère que cela pourra aider.
la source