


Introduction à l'utilisation d'openssl pour remplacer mcrypt dans PHP7.1
Cet article présente principalement l'introduction de l'utilisation d'openssl pour remplacer mcrypt dans PHP7.1. Il a une certaine valeur de référence. Maintenant, je le partage avec vous. Les amis dans le besoin peuvent s'y référer
<.>Utilisez openssl pour remplacer mcrypt dans PHP7.1Dans le développement PHP, l'utilisation des fonctions liées à mcrypt peut facilement effectuer des opérations de cryptage et de décryptage AES, mais l'extension mcrypt est abandonnée dans PHP7.1, vous devez donc en trouver une autre sorte de réalisation. Le remplacement de mcrypt par openssl est déjà souligné dans le manuel de migration, mais aucun exemple spécifique n'est donné. Il existe de nombreux exemples en ligne qui peuvent remplacer la plupart des scénarios, mais les détails ne sont pas expliqués. De même, la simple utilisation d'exemples en ligne peut entraîner des problèmes de compatibilité avant et après le remplacement du code dans certains scénarios de code. Parlons des codes spécifiques et des raisons ci-dessous. Nous donnons d'abord directement le code de remplacement, puis analysons le problème à partir du code.(L'algorithme analysé dans cet article est AES-128-CBC)
Exemple de remplacementL'exemple montrera deux façons d'utiliser mcrypt, principalement enpadding Différent (Rembourrage sera expliqué ci-dessous). Pendant tout le processus de cryptage et de déchiffrement, le code le plus complet implémentera automatiquement le remplissage et la suppression du remplissage, et le code le plus simple ignorera directement le remplissage, mais les deux méthodes peuvent fonctionner normalement dans le développement réel (versions antérieures à 7.1), il est recommandé ; pour ajouter du rembourrage. Veuillez consulter l'exemple spécifique suivant :
- mcrypt n'utilise pas de remplissage
- le cryptage mcrypt :
$key = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; $iv = 'aaaaaaaaaaaaaaaa'; $data = 'dataString'; $cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, ''); mcrypt_generic_init($cipher, $key, $iv); $cipherText256 = mcrypt_generic($cipher, $data); mcrypt_generic_deinit($cipher); return bin2hex($cipherText256);
Copier après la connexion - Code de cryptage Openssl avec la même fonction :
$key = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; $iv = 'aaaaaaaaaaaaaaaa'; $data = 'dataString'; $data = $data . str_repeat("\x00", 16 - (strlen($data) % 16)); // 双引号可以解析asc-ii码\x00 return bin2hex(openssl_encrypt($data, "AES-256-CBC", $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv));
Copier après la connexion
- Cryptage mcrypt :
$key = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; $iv = 'aaaaaaaaaaaaaaaa'; $data = 'dataString'; // 填充(移除填充反着移除即可) $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); $pad = $block - (strlen($data) % $block); if ($pad <= $block) { $char = chr($pad); $data .= str_repeat($char, $pad); } $cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, ''); mcrypt_generic_init($cipher, $key, $iv); $cipherText256 = mcrypt_generic($cipher, $data); mcrypt_generic_deinit($cipher); return bin2hex($cipherText256);
Copier après la connexion - Code de cryptage Openssl avec la même fonction :
$key = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; $iv = 'aaaaaaaaaaaaaaaa'; $data = 'dataString'; return bin2hex(openssl_encrypt($data, 'AES-256-CBC', $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv));
Copier après la connexion
- Pourquoi y a-t-il un remplissage ?
- Pourquoi les noms des algorithmes sont-ils différents après les avoir remplacés par openssl ?
remplissage et de l'algorithme.
RemplissageLa raison pour laquelle il y a un remplissage commence par l'algorithme de cryptage. Parce que dans l'algorithme AES-128-CBC, la chaîne à chiffrer sera segmentée en segments tous les 16 octets de longueur et calculée étape par étape, ce qui entraînera le remplissage de segments de moins de 16 octets. Il existe donc deux types d'exemples donnés : l'un consiste à utiliser le remplissage par défaut et l'autre à utiliser un remplissage indépendant. Lors du remplacement d'openssl, comment choisir le schéma de remplissage nécessite une compréhension du remplissage par défaut et autonome de mcrypt et openssl.- rembourrage par défaut mcryptDans le code source de php, on peut voir que le remplissage par défaut est avec
En fait, il n'est pas complété avec.
, lex00
, on peut trouver à partir du code source qu'une chaîne vide de 16 bits est d'abord demandée, donc chaque octet estx00
lors de l'initialisation. En fait, on peut dire qu'il n'y a pas de remplissage, mais. il s'agit à l'origine dex00
. Utilisez la valeur par défaut. La chaîne cryptée complétée sera sous la forme suivante :x00
redondant doit donc être supprimé lors du déchiffrement. Bien sûr, vous pouvez aussi être paresseux et ne pas supprimer
x00
. Parce qu'en php, la chaîne "stringx00" et la chaîne "string" ont les mêmes performances sauf pour la longueur, donc il ne semble y avoir aucune différence. Le code suivant :x00
// 尾部包含若干个`\x00` 均可功输出true if ("string\x00" == "string") { // 用双引号可解析\x00 echo true; }
Copier après la connexionAprès remplissage. Exemple de : (Veuillez faire attention à la longueur de la chaîne, on peut voir que le remplissage avec
x00
affectera la longueur) L'algorithme de remplissage doit être effectué comme suit :x00
Ajouter un remplissage - Après avoir ajouté un remplissage, la chaîne a en fait la forme suivante :
Supprimer le remplissage
/** * 填充算法 * @param string $source * @return string */ function addPKCS7Padding($source) { $source = trim($source); $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); $pad = $block - (strlen($source) % $block); if ($pad <= $block) { $char = chr($pad); $source .= str_repeat($char, $pad); } return $source; }
Copier après la connexion
remplissage par défaut d'openssl- La méthode par défaut est la même que celle du mcrypt standard. La méthode de remplissage autonome est la même, donc dans le deuxième exemple, après avoir utilisé le au-dessus de l'algorithme de remplissage, il peut être directement remplacé par openssl_encrypt sans causer de problèmes de compatibilité. La chaîne cryptée rembourrée se présente sous la forme suivante :
/** * 移去填充算法 * @param string $source * @return string */ function stripPKSC7Padding($source) { $source = trim($source); $char = substr($source, -1); $num = ord($char); if ($num == 62) return $source; $source = substr($source, 0, -$num); return $source; }
Copier après la connexion - Il est à noter que le remplissage et la suppression du remplissage sont intégrés dans
et
, donc directement, utilisez-le simplement. À moins que vous n'ayez besoin d'implémenter le remplissage indépendamment, il n'est pas nécessaire d'envisager le remplissage
remplissage indépendant opensslopenssl_encrypt提供了option参数以支持自主填充,但在查阅php源码中openssl的测试用例代码才找到正确用法:
// if we want to manage our own padding $padded_data = $data . str_repeat(' ', 16 - (strlen($data) % 16)); $encrypted = openssl_encrypt($padded_data, $method, $password, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING, $iv); $output = openssl_decrypt($encrypted, $method, $password, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING, $iv); var_dump(rtrim($output));
Copier après la connexion(备注:如上,
OPENSSL_ZERO_PADDING
并非是为0填充的意思)
由此,我们就可以解释,在第一个示例中openssl_encrypt之前加入了自主点充\x00
的代码原因了
从以上的加、解密针对填充逻辑不同,针对上文中的示例可以很好地解释:
示例1:
mcrypt加密时未使用填充,故以\x00
进行了填充,所以在替换成openssl,需要自主实现\x00
填充。示例2:
mcrypt加密时使用了标准的填充,同时openssl的填充方式也为Introduction à lutilisation dopenssl pour remplacer mcrypt dans PHP7.1,故直接使用即可。
分析到这,可以发现,无论是何种填充策略都需注意在加密时加入填充,在解密时则必须要移除填充。至此,上文中示例中的填充相关则分析完成了,接下来我们再看看如何选择替换后的算法。
选择算法
在以上的示例中,有一个问题在于,mcrypt中的AES-128-CBC算法,在openssl中怎么替换成了AES_256?
关于这一点, 我也未找到合理的解释,查看源码一时半会也没找到原因(能力有限~),但通过以下资料,还是完成了功能
openssl 解密 mcrypt AES 数据不兼容问题
Convert mcrypt_generic to openssl_encrypt Ask Question
若是有同学找到原因,欢迎给我留言,谢谢。
总结
对于使用mcrypt AES 进行加密密的部分,若是在替换过程中问题, 可以从算法替换或填充这两方面着手考虑下。同时还是一必须满足的条件是根据不同的填充方式选择, 替换最重要的就要考虑兼容问题,保证替换后不发生任何改变。 虽然只是只是有细微的差别----尾部几个字符串的不同,但若是在多平台中同时进行修改也是一件麻烦事,但变动越少风险越小。
本文只是针对AES算法进行了简单说明,对于其他算法是否适用还有待研究。
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!
相关推荐:
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Alipay Php ...

JWT est une norme ouverte basée sur JSON, utilisée pour transmettre en toute sécurité des informations entre les parties, principalement pour l'authentification de l'identité et l'échange d'informations. 1. JWT se compose de trois parties: en-tête, charge utile et signature. 2. Le principe de travail de JWT comprend trois étapes: la génération de JWT, la vérification de la charge utile JWT et l'analyse. 3. Lorsque vous utilisez JWT pour l'authentification en PHP, JWT peut être généré et vérifié, et les informations sur le rôle et l'autorisation des utilisateurs peuvent être incluses dans l'utilisation avancée. 4. Les erreurs courantes incluent une défaillance de vérification de signature, l'expiration des jetons et la charge utile surdimensionnée. Les compétences de débogage incluent l'utilisation des outils de débogage et de l'exploitation forestière. 5. L'optimisation des performances et les meilleures pratiques incluent l'utilisation des algorithmes de signature appropriés, la définition des périodes de validité raisonnablement,

Le détournement de la session peut être réalisé via les étapes suivantes: 1. Obtenez l'ID de session, 2. Utilisez l'ID de session, 3. Gardez la session active. Les méthodes pour empêcher le détournement de la session en PHP incluent: 1. Utilisez la fonction Session_RegeReate_id () pour régénérer l'ID de session, 2. Stocker les données de session via la base de données, 3. Assurez-vous que toutes les données de session sont transmises via HTTPS.

L'application du principe solide dans le développement de PHP comprend: 1. Principe de responsabilité unique (SRP): Chaque classe n'est responsable d'une seule fonction. 2. Principe ouvert et ferme (OCP): les changements sont réalisés par extension plutôt que par modification. 3. Principe de substitution de Lisch (LSP): les sous-classes peuvent remplacer les classes de base sans affecter la précision du programme. 4. Principe d'isolement d'interface (ISP): utilisez des interfaces à grain fin pour éviter les dépendances et les méthodes inutilisées. 5. Principe d'inversion de dépendance (DIP): les modules élevés et de bas niveau reposent sur l'abstraction et sont mis en œuvre par injection de dépendance.

Comment définir automatiquement les autorisations d'UnixSocket après le redémarrage du système. Chaque fois que le système redémarre, nous devons exécuter la commande suivante pour modifier les autorisations d'UnixSocket: sudo ...

Comment déboguer le mode CLI dans phpstorm? Lors du développement avec PHPStorm, nous devons parfois déboguer PHP en mode interface de ligne de commande (CLI) ...

Liaison statique (statique: :) implémente la liaison statique tardive (LSB) dans PHP, permettant à des classes d'appel d'être référencées dans des contextes statiques plutôt que de définir des classes. 1) Le processus d'analyse est effectué au moment de l'exécution, 2) Recherchez la classe d'appel dans la relation de succession, 3) il peut apporter des frais généraux de performance.

Envoyant des données JSON à l'aide de la bibliothèque Curl de PHP dans le développement de PHP, il est souvent nécessaire d'interagir avec les API externes. L'une des façons courantes consiste à utiliser la bibliothèque Curl pour envoyer le post� ...
