


Partage de l'algorithme de chiffrement à l'aide de l'opération XOR dans l'application PHP MySQL
Jan 07, 2017 pm 04:36 PMPrincipe de l'algorithme XOR
Du point de vue de la méthode principale de cryptage, la méthode de transposition est trop simple, surtout lorsque la quantité de données est petite, il est facile de deviner le texte en clair à partir du texte chiffré, et la méthode de substitution est un bon choix. Algorithme simple et efficace.
D'après les caractéristiques des diverses opérations de substitution, l'opération XOR est la plus adaptée aux opérations simples de cryptage et de déchiffrement. Le principe de cette méthode est le suivant?: lorsqu'un nombre A et un autre nombre B sont XOR, elle générera un autre. numéro C, si C et B sont XORed, C sera restauré en A.
Par rapport à d'autres algorithmes de chiffrement simples, les avantages de l'algorithme XOR sont les suivants.
(1) L'algorithme est simple et peut être facilement implémenté dans des langages de haut niveau.
(2) Il est rapide et peut être utilisé à tout moment et n'importe où.
(3) est valable pour n'importe quel caractère, contrairement à certains algorithmes de cryptage simples, qui ne sont valables que pour les caractères occidentaux. Après avoir crypté les caractères chinois puis les avoir déchiffrés, ils ne peuvent pas être restaurés aux caractères d'origine.
Implémentation de l'algorithme XOR
La partie précédente a présenté le principe d'utilisation de l'opération XOR pour le cryptage/déchiffrement. Cette section l'utilisera pour crypter les informations de connexion de l'utilisateur. Selon le principe de l'algorithme de chiffrement XOR présenté dans la section précédente, il n'est pas difficile d'écrire les fonctions de chiffrement et de déchiffrement suivantes. Les algorithmes de chiffrement sont répertoriés en premier.
<!–encrypy_xor:簡(jiǎn)單使用XOR運(yùn)算的加密函數(shù)———————–> <?php //加密函數(shù) functionmyEncrypt($string,$key) { for($i=0;$i<STRLEN($STRING);p$i++)<> { for($j=0;$j<STRLEN($KEY);p$j++)<> { $string[$i]=$string[$i]^$key[$j]; } } return$string; }
La ligne 4 définit la fonction de cryptage myEncrypt(). Le paramètre d'entrée $string est du texte brut et $key est la clé ; la sortie est le mot de passe généré en utilisant $key comme clé et le XOR?; algorithme de cryptage arts.
La boucle for externe des lignes 6 à 12 parcourt chaque caractère de la cha?ne de texte en clair, tandis que la boucle for interne (lignes 8 à 11) parcourt chaque caractère du texte en clair et chaque caractère de l'opération Bit XOR. Le principe a été introduit dans la section précédente et ne sera pas réitéré.
De même, similaire à la fonction de cryptage, la fonction de décryptage suivante peut être écrite.
//解密函數(shù) functionmyDecrypt($string,$key) { for($i=0;$i<STRLEN($STRING);p$i++)<> { for($j=0;$j<STRLEN($KEY);p$j++)<> { $string[$i]=$key[$j]^$string[$i]; } } return$string; } ?>
La ligne 4 définit la fonction de décryptage myDecrypt(), le paramètre d'entrée $string est le texte chiffré et $key est la clé ; la sortie est générée en utilisant $key comme clé et en utilisant le déchiffrement XOR?; algorithme en texte brut.
Ci-dessous, un exemple d'application est utilisé pour illustrer davantage le fonctionnement de la fonction de cryptage.
//示例 $my_password="chair"; echo"my_password=$my_password"; $my_key="1234567890″; $my_password_en=myEncrypt($my_password,$my_key); echo"my_password_en=$my_password_en"; $my_password_de=myDecrypt($my_password_en,$my_key); echo"my_password_de=$my_password_de";
La ligne 3 définit d'abord un texte en clair $my_password, puis définit la clé $my_key à la ligne 4.
Les lignes 5 et 6 appellent la fonction de cryptage pour générer le texte chiffré et le sortir à son tour, le texte chiffré est déchiffré sur les lignes 7 et 8.
Les résultats de l'exemple ci-dessus sont les suivants.
my_password=chair
my_password_en=RYPXC
my_password_de=chair
Utiliser l'algorithme XOR pour implémenter l'authentification
Les deux parties précédentes présentent le principe et la mise en ?uvre du cryptage/déchiffrement des informations à l'aide de l'opération XOR Ce qui suit. is , cette méthode sera utilisée pour crypter le mot de passe de connexion de l'utilisateur. Dans cet exemple, afin de protéger le mot de passe de l'utilisateur, le système souhaite atteindre les objectifs suivants.
·Lors de son inscription, l'utilisateur doit remplir le formulaire de mot de passe utilisateur.
·En plus de l'utilisateur lui-même, personne d'autre ne peut obtenir ses informations de mot de passe, y compris les concepteurs de systèmes et les administrateurs de bases de données.
·Le système peut vérifier la légitimité de l'utilisateur en fonction du mot de passe saisi par l'utilisateur.
Afin d'atteindre l'objectif ci-dessus, lorsque vous utilisez l'algorithme XOR, vous pouvez choisir le nom d'utilisateur sous forme de texte brut, et la clé est le mot de passe défini par l'utilisateur, puis stocker le nom d'utilisateur crypté dans la base de données.
De plus, lorsqu'un utilisateur se connecte, il existe les deux manières suivantes de vérifier les utilisateurs légitimes.
(1) Chiffrez à nouveau en fonction des informations de nom d'utilisateur (texte brut) et de mot de passe (clé) soumises, et utilisez les informations cryptées pour comparer avec les informations de mot de passe stockées dans la base de données. Si elles sont égales, l'utilisateur est légitime. , sinon, Pour les utilisateurs illégaux.
(2) Décryptez en fonction des informations de mot de passe (texte brut) stockées dans la base de données et des informations de mot de passe (clé) saisies par l'utilisateur, et comparez les informations cryptées avec le nom d'utilisateur soumis par l'utilisateur s'ils sont égaux. , l'utilisateur est légitime, sinon c'est un utilisateur illégal.
Les deux méthodes peuvent atteindre le troisième objectif. Dans cet exemple, la deuxième méthode sera utilisée. Le code d'implémentation de cet exemple peut être implémenté sur la base de l'implémentation de la section 18.4.1 ? Connexion utilisateur ? et de la section 18.4.2 ? Vérifier l'utilisateur ?. La page ? Connexion utilisateur ? n'a pas besoin d'être modifiée. La référence d'implémentation de ? . Vérifier l'utilisateur" est la suivante.
<?php session_start();//裝載Session庫(kù),一定要放在首行 $user_name=$_POST["user_name"]; session_register(“user_name");//注冊(cè)$user_name變量,注意沒(méi)有$符號(hào) require_once(“sys_conf.inc");//系統(tǒng)配置文件,包含數(shù)據(jù)庫(kù)配置信息 require_once(“encrypy_xor.php");//包含xor加密函數(shù)文件 //連接數(shù)據(jù)庫(kù) $link_id=mysql_connect($DBHOST,$DBUSER,$DBPWD); mysql_select_db($DBNAME);//選擇數(shù)據(jù)庫(kù)my_chat //查詢是否存在登錄用戶信息 $str="selectname,passwordfromuserwherename='$user_name'"; $result=mysql_query($str,$link_id);//執(zhí)行查詢 @$rows=mysql_num_rows($result);//取得查詢結(jié)果的記錄筆數(shù) $user_name=$_SESSION["user_name"]; $password=$_POST["password"]; $password_en=myEncrypt($user_name,$password);//加密用戶信息 //對(duì)于老用戶 if($rows!=0) { list($name,$pwd)=mysql_fetch_row($result); $password_de=myDecrypt($pwd,$password);//解密用戶信息 //如果密碼輸入正確 if($user_name==$password_de) { $str="updateusersetis_online=1wherename='$user_name'andpassword='$password_en'"; $result=mysql_query($str,$link_id);//執(zhí)行查詢 require(“main.php");//轉(zhuǎn)到聊天頁(yè)面 } //密碼輸入錯(cuò)誤 else { require(“relogin.php"); } } //對(duì)于新用戶,將其信息寫(xiě)入數(shù)據(jù)庫(kù) else { $str="insertintouser(name,password,is_online)values(‘$user_name','$password_en',1)"; $result=mysql_query($str,$link_id);//執(zhí)行查詢 require(“main.php");//轉(zhuǎn)到聊天頁(yè)面 } //關(guān)閉數(shù)據(jù)庫(kù) mysql_close($link_id); ?>
La ligne 7 introduit le fichier de fonctions de chiffrement encrypy_xor.php, incluant les deux fonctions introduites dans la section précédente.
à la ligne 19, le nom d'utilisateur et le mot de passe soumis par l'utilisateur sont utilisés pour obtenir la valeur du mot de passe crypté, et pour les nouveaux utilisateurs, la valeur cryptée est stockée dans la base de données à la ligne 44.
De plus, pour les anciens utilisateurs, obtenez les informations de nom d'utilisateur et de mot de passe crypté dans la base de données à la ligne 24, et utilisez ces deux valeurs pour décrypter à la ligne 25, puis comparez la valeur déchiffrée avec celle soumise par l'utilisateur à la ligne 28 Informations sur le nom d'utilisateur pour vérifier la légitimité de l'utilisateur.
Générer automatiquement les clés
La partie précédente a présenté comment utiliser l'algorithme de cryptage XOR pour crypter les informations de l'utilisateur. Les informations de mot de passe saisies par l'utilisateur deviennent en fait la clé dans l'algorithme de cryptage et le nom d'utilisateur est utilisé sous forme de texte brut. Même si cela fait bien son travail, cette approche semble logiquement un peu peu judicieuse.
Cet article présentera une technologie qui génère automatiquement des clés. Vous pouvez utiliser les clés générées automatiquement pour crypter le texte brut des mots de passe soumis par les utilisateurs, rendant la logique plus raisonnable.
Dans cet exemple, on suppose que la clé générée est de 512 bits. Le code est le suivant.
<!–keygen.php:自動(dòng)生成密鑰————————————> <?php //自動(dòng)生成長(zhǎng)度為$len的密鑰 functiongenerate_key($len) { $lowerbound=35; $upperbound=96; $strMyKey=""; for($i=1;$i<=$len;$i++) { $rnd=rand(0,100);//產(chǎn)生隨機(jī)數(shù) $k=(($upperbound-$lowerbound)+1)*$rnd+$lowerbound; $strMyKey=$strMyKey.$k; } return$strMyKey; } //將密鑰寫(xiě)入文件$file_name functionwrite_key($key,$file_name) { $filename="C:\key.txt"; $key=generate_key($key,512); //使用添加模式打開(kāi)$filename,文件指針將會(huì)在文件的末尾 if(!$handle=fopen($filename,'w')) { print"不能打開(kāi)文件$filename"; exit; } //將$key寫(xiě)入到我們打開(kāi)的文件中。 if(!fwrite($handle,$key)) { print"不能寫(xiě)入到文件$filename"; exit; } fclose($handle); } //讀取密鑰文件中的密鑰 functionget_key($file_name) { //打開(kāi)文件 $fp=fopen($file_name,"r"); $result=""; //逐行讀取 while(!feof($fp)) { $buffer=fgets($fp,4096); $result=$result.$buffer; } return$result; } ///* $KeyLocation="C:\key.txt";//保存密鑰的文件 $key="123456″; write_key($key,$KeyLocation); echoget_key($KeyLocation); //*/ ?>
代碼包括3個(gè)函數(shù)。?
◆ generate_key($len):自動(dòng)生成長(zhǎng)度為$len的密鑰?
◆ write_key($key,$file_name):將密鑰寫(xiě)入文件$file_name?
◆ get_key($file_name):讀取密鑰文件$file_name中的密鑰值?
在使用時(shí),當(dāng)用戶第一次登錄系統(tǒng)時(shí),自動(dòng)為其生成密鑰值,對(duì)于這個(gè)密鑰值,可以有兩種方式來(lái)處理。?
(1)將其存入數(shù)據(jù)庫(kù)的某個(gè)字段中,這種方法的缺點(diǎn)是密鑰在數(shù)據(jù)庫(kù)中的安全性無(wú)法得到保證;?
(2)將這個(gè)密鑰保存在用戶本地的文件中,這樣就可以避免密鑰被別人獲取,但這種方式的缺點(diǎn)是,當(dāng)用戶使用其他機(jī)器訪問(wèn)系統(tǒng)時(shí),就無(wú)法登錄。?
本例中,將使用第2種方式。?
具體地,上面代碼第11~18行通過(guò)生成隨機(jī)數(shù)的方式來(lái)不斷生成密鑰,并通過(guò)一個(gè)計(jì)算來(lái)增強(qiáng)其復(fù)雜性。其中的lowerbound和upperbound的數(shù)值其實(shí)就是你想使用來(lái)加密的ASCII字符范圍。下面是生成的一個(gè)密鑰文件示例。?
208123915925183361116049369344372701567721435181102718332639307390344373445407?
524316475863232913993383189547474747394154915312639841226741894189965623523913?
011164730113445201935692839710274127251577929493941487145611337531549110895367?
593586318332391170941272701152344371709270125776235313540032267139933835677407?
617384135696111239130732949469623520815987524358635491542913374933524334454251?
400327015367133759324537171709152357391089524342514685239122673135531363151191?
833412771743139654…?
最后,需要把密鑰保存在服務(wù)器上一個(gè)安全的地方,然后就可以利用其和諸如XOR這樣的加密算法來(lái)對(duì)用戶信息進(jìn)行加密/解密了。如何在上一部分介紹的XOR中使用這個(gè)密鑰非常簡(jiǎn)單,不再詳述。
更多PHP MySQL應(yīng)用中使用XOR運(yùn)算加密算法分享相關(guān)文章請(qǐng)關(guān)注PHP中文網(wǎng)!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

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.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
échangez les visages dans n'importe quelle vidéo sans effort grace à 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)

Les problèmes et les solutions courants pour la portée de la variable PHP incluent: 1. La variable globale ne peut pas être accessible dans la fonction, et elle doit être transmise en utilisant le mot-clé ou le paramètre global; 2. La variable statique est déclarée avec statique, et elle n'est initialisée qu'une seule fois et la valeur est maintenue entre plusieurs appels; 3. Des variables hyperglobales telles que $ _get et $ _post peuvent être utilisées directement dans n'importe quelle portée, mais vous devez faire attention au filtrage s?r; 4. Les fonctions anonymes doivent introduire des variables de portée parents via le mot clé Utiliser, et lorsque vous modifiez les variables externes, vous devez passer une référence. La ma?trise de ces règles peut aider à éviter les erreurs et à améliorer la stabilité du code.

Pour gérer en toute sécurité les téléchargements de fichiers PHP, vous devez vérifier la source et taper, contr?ler le nom et le chemin du fichier, définir les restrictions du serveur et traiter les fichiers multimédias deux fois. 1. Vérifiez la source de téléchargement pour empêcher le CSRF via le jeton et détecter le type de mime réel via FINFO_FILE en utilisant le contr?le de liste blanche; 2. Renommez le fichier à une cha?ne aléatoire et déterminez l'extension pour la stocker dans un répertoire non Web en fonction du type de détection; 3. La configuration PHP limite la taille de téléchargement et le répertoire temporaire Nginx / Apache interdit l'accès au répertoire de téléchargement; 4. La bibliothèque GD résait les images pour effacer des données malveillantes potentielles.

Il existe trois méthodes courantes pour le code de commentaire PHP: 1. Utiliser // ou # pour bloquer une ligne de code, et il est recommandé d'utiliser //; 2. Utiliser /.../ pour envelopper des blocs de code avec plusieurs lignes, qui ne peuvent pas être imbriquées mais peuvent être croisées; 3. Compétences combinées Commentaires tels que l'utilisation / if () {} / pour contr?ler les blocs logiques, ou pour améliorer l'efficacité avec les touches de raccourci de l'éditeur, vous devez prêter attention aux symboles de fermeture et éviter les nidification lorsque vous les utilisez.

La clé pour rédiger des commentaires PHP est de clarifier l'objectif et les spécifications. Les commentaires devraient expliquer "pourquoi" plut?t que "ce qui a été fait", en évitant la redondance ou trop de simplicité. 1. Utilisez un format unifié, tel que DocBlock (/ * /) pour les descriptions de classe et de méthode afin d'améliorer la lisibilité et la compatibilité des outils; 2. Soulignez les raisons de la logique, telles que pourquoi les sauts JS doivent être sortis manuellement; 3. Ajoutez une description d'une vue d'ensemble avant le code complexe, décrivez le processus dans les étapes et aidez à comprendre l'idée globale; 4. Utilisez TODO et FIXME Rationalement pour marquer des éléments et des problèmes de taches pour faciliter le suivi et la collaboration ultérieurs. De bonnes annotations peuvent réduire les co?ts de communication et améliorer l'efficacité de la maintenance du code.

AgeneratorInphpisamemory-EfficientwaytoterateOrgedatasetsByyieldingValuesonEatatimeIntedofreturningThemallAtonce.1.GeneratorsUsEtheieldKeywordToproduceValuesondemand, ReducingMemoryUsage.2.TheyAreusefulForHandlingBigloops, ReadingLargeFiles, OR OR.

Toléarnphpeffective, startBySettingUpAlocalServerERironmentUsingToolsLILYXAMPPANDACODEDITERLIGHILLEVSCODE.1) INSTRUSITIONXAMPFORAPACHE, MYSQL, ANDPHP.2) USACODEDEDITORFORSYNTAXSUPPORT.3)

En PHP, vous pouvez utiliser des crochets ou des accolades bouclées pour obtenir des caractères d'index spécifiques à la cha?ne, mais les crochets sont recommandés; L'index commence à partir de 0 et l'accès à l'extérieur de la plage renvoie une valeur nulle et ne peut pas se voir attribuer une valeur; MB_substr est nécessaire pour gérer les caractères multi-octets. Par exemple: $ str = "Hello"; echo $ str [0]; sortie h; et les caractères chinois tels que MB_substr ($ str, 1,1) doivent obtenir le résultat correct; Dans les applications réelles, la longueur de la cha?ne doit être vérifiée avant le boucle, les cha?nes dynamiques doivent être vérifiées pour la validité et les projets multilingues recommandent d'utiliser des fonctions de sécurité multi-octets uniformément.

Toinstallphpquickly, usexAmpPonWindowsorHomebrewonMacos.1.onwindows, downloadAndInstallxAmppp, selectComponents, startapache et placefilesInhtdocs.2.
