Quelle est la façon la plus simple de procéder au chiffrement bidirectionnel dans les installations PHP courantes?
J'ai besoin de pouvoir chiffrer les données avec une clé de chaîne et utiliser la même clé pour déchiffrer à l'autre extrémité.
La sécurité n'est pas aussi importante que la portabilité du code, donc j'aimerais pouvoir garder les choses aussi simples que possible. Actuellement, j'utilise une implémentation RC4, mais si je peux trouver quelque chose pris en charge nativement, je pense que je peux économiser beaucoup de code inutile.
php
security
encryption
cryptography
encryption-symmetric
user1206970
la source
la source
Sodium::crypto_secretbox()
etSodium::crypto_secretbox_open()
sont sûrs et performants.Réponses:
Édité:
Vous devriez vraiment utiliser openssl_encrypt () & openssl_decrypt ()
Comme le dit Scott , Mcrypt n'est pas une bonne idée car il n'a pas été mis à jour depuis 2007.
Il existe même un RFC pour supprimer Mcrypt de PHP - https://wiki.php.net/rfc/mcrypt-viking-funeral
la source
Important : à moins que vous n'ayez un cas d'utilisation très particulier, ne cryptez pas les mots de passe , utilisez plutôt un algorithme de hachage de mot de passe. Lorsque quelqu'un dit chiffrer ses mots de passe dans une application côté serveur, il n'est pas informé ou décrit une conception de système dangereuse. Le stockage sécurisé des mots de passe est un problème totalement distinct du cryptage.
Être informé. Concevez des systèmes sûrs.
Cryptage de données portable en PHP
Si vous utilisez PHP 5.4 ou une version plus récente et que vous ne voulez pas écrire un module de cryptographie vous-même, je vous recommande d'utiliser une bibliothèque existante qui fournit un cryptage authentifié . La bibliothèque que j'ai liée ne dépend que de ce que PHP fournit et est régulièrement revue par une poignée de chercheurs en sécurité. (Moi inclus.)
Si vos objectifs de portabilité n'empêchent pas d'exiger des extensions PECL, libsodium est fortement recommandé par rapport à tout ce que vous ou moi pouvons écrire en PHP.
Mise à jour (2016-06-12): Vous pouvez maintenant utiliser sodium_compat et utiliser les mêmes offres de crypto libsodium sans installer d'extensions PECL.
Si vous voulez vous essayer à l'ingénierie de la cryptographie, lisez la suite.
Tout d'abord, vous devriez prendre le temps d'apprendre les dangers du chiffrement non authentifié et le principe du destin cryptographique .
Cryptage et décryptage
Le cryptage en PHP est en fait simple (nous allons utiliser
openssl_encrypt()
etopenssl_decrypt()
une fois que vous aurez pris certaines décisions sur la façon de crypter vos informations. Consultezopenssl_get_cipher_methods()
pour une liste des méthodes prises en charge sur votre système. Le meilleur choix est AES en mode CTR :aes-128-ctr
aes-192-ctr
aes-256-ctr
Il n'y a actuellement aucune raison de penser que la taille de la clé AES est un problème important à craindre (une taille plus grande n'est probablement pas meilleure, en raison d'une mauvaise programmation des clés en mode 256 bits).
Remarque: nous ne l'utilisons pas
mcrypt
car il s'agit d'un abandonware et de bogues non corrigés qui pourraient affecter la sécurité. Pour ces raisons, j'encourage les autres développeurs PHP à l'éviter également.Wrapper de chiffrement / déchiffrement simple à l'aide d'OpenSSL
Exemple d'utilisation
Démo : https://3v4l.org/jl7qR
La bibliothèque de cryptographie simple ci-dessus n'est toujours pas sûre à utiliser. Nous devons authentifier les textes chiffrés et les vérifier avant de déchiffrer .
Remarque : par défaut,
UnsafeCrypto::encrypt()
renvoie une chaîne binaire brute. Appelez-le comme ceci si vous avez besoin de le stocker dans un format binaire (codé en base64):Démo : http://3v4l.org/f5K93
Wrapper d'authentification simple
Exemple d'utilisation
Démos : binaire brut , encodé en base64
Si quelqu'un souhaite utiliser cette
SaferCrypto
bibliothèque dans un environnement de production, ou votre propre implémentation des mêmes concepts, je recommande fortement de contacter vos cryptographes résidents pour un deuxième avis avant de le faire. Ils pourront vous parler d'erreurs que je ne connais peut-être même pas.Vous serez beaucoup mieux en utilisant une bibliothèque de cryptographie réputée .
la source
Utilisez
mcrypt_encrypt()
etmcrypt_decrypt()
avec les paramètres correspondants. Vraiment facile et simple, et vous utilisez un package de cryptage éprouvé.ÉDITER
5 ans et 4 mois après cette réponse, l'
mcrypt
extension est désormais en cours de dépréciation et de suppression éventuelle de PHP.la source
PHP 7.2 s'est complètement éloigné
Mcrypt
et le cryptage est désormais basé sur laLibsodium
bibliothèque maintenable .Tous vos besoins de chiffrement peuvent être essentiellement résolus via la
Libsodium
bibliothèque.Documentation Libsodium: https://github.com/paragonie/pecl-libsodium-doc
la source
crypto_sign
API ne crypte pas les messages - cela nécessitera l'une descrypto_aead_*_encrypt
fonctions.IMPORTANT cette réponse n'est valable que pour PHP 5, en PHP 7 utilisez des fonctions cryptographiques intégrées.
Voici une implémentation simple mais suffisamment sécurisée:
Le code et les exemples sont ici: https://stackoverflow.com/a/19445173/1387163
la source