suchen
HeimBackend-EntwicklungPHP-Tutorial有关discuz程序中PHP加密函数的原理分析

  1. // 参数解释

  2. // $string: 明文 或 密文
  3. // $operation:DECODE表示解密,其它表示加密
  4. // $key: 密匙
  5. // $expiry:密文有效期
  6. function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {
  7. // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙
  8. $ckey_length = 4;
  9. // 密匙

  10. $key = md5($key ? $key : $GLOBALS['discuz_auth_key']);
  11. // 密匙a会参与加解密

  12. $keya = md5(substr($key, 0, 16));
  13. // 密匙b会用来做数据完整性验证
  14. $keyb = md5(substr($key, 16, 16));
  15. // 密匙c用于变化生成的密文
  16. $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length):
  17.   substr(md5(microtime()), -$ckey_length)) : '';
  18. // 参与运算的密匙
  19. $cryptkey = $keya.md5($keya.$keyc);
  20. $key_length = strlen($cryptkey);
  21. // 明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b),解密时会通过这个密匙验证数据完整性
  22. // 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确
  23. $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) :
  24.   sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
  25. $string_length = strlen($string);
  26. $result = '';
  27. $box = range(0, 255);
  28. $rndkey = array();
  29. // 产生密匙簿
  30. for($i = 0; $i $rndkey[$i] = ord($cryptkey[$i % $key_length]);
  31. }
  32. // 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度
  33. for($j = $i = 0; $i $j = ($j + $box[$i] + $rndkey[$i]) % 256;
  34. $tmp = $box[$i];
  35. $box[$i] = $box[$j];
  36. $box[$j] = $tmp;
  37. }
  38. // 核心加解密部分
  39. for($a = $j = $i = 0; $i $a = ($a + 1) % 256;
  40. $j = ($j + $box[$a]) % 256;
  41. $tmp = $box[$a];
  42. $box[$a] = $box[$j];
  43. $box[$j] = $tmp;
  44. // 从密匙簿得出密匙进行异或,再转成字符
  45. $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
  46. }
  47. if($operation == 'DECODE') {
  48. // substr($result, 0, 10) == 0 验证数据有效性
  49. // substr($result, 0, 10) - time() > 0 验证数据有效性
  50. // substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16) 验证数据完整性
  51. // 验证数据有效性,请看未加密明文的格式
  52. if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) &&
  53.   substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {
  54. return substr($result, 26);
  55. } else {
  56. return '';
  57. }
  58. } else {
  59. // 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因
  60. // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码
  61. return $keyc.str_replace('=', '', base64_encode($result));
  62. }
  63. } //edit bbs.it-home.org
  64. ?>
复制代码

有兴趣的朋友,好好琢磨下人家的实现思想,对于学习php加密与解密,是很有用的哦。 提醒:此函数所有权属于康盛创想,并不能自由使用,呵呵。



Stellungnahme
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Was ist der Unterschied zwischen absoluten und müßigen Sitzungszeitüberschreitungen?Was ist der Unterschied zwischen absoluten und müßigen Sitzungszeitüberschreitungen?May 03, 2025 am 12:21 AM

Die Absolute -Sitzungs -Zeitlimit startet zum Zeitpunkt der Erstellung der Sitzung, während eine Zeitlimit in der Leerlaufsitzung zum Zeitpunkt der No -Operation des Benutzers beginnt. Das Absolute -Sitzungs -Zeitlimit ist für Szenarien geeignet, in denen eine strenge Kontrolle des Sitzungslebenszyklus erforderlich ist, z. B. finanzielle Anwendungen. Das Timeout der Leerlaufsitzung eignet sich für Anwendungen, die die Benutzer für lange Zeit aktiv halten, z. B. soziale Medien.

Welche Schritte würden Sie unternehmen, wenn Sitzungen nicht auf Ihrem Server funktionieren?Welche Schritte würden Sie unternehmen, wenn Sitzungen nicht auf Ihrem Server funktionieren?May 03, 2025 am 12:19 AM

Der Serversitzungsausfall kann durch Befolgen der Schritte gelöst werden: 1. Überprüfen Sie die Serverkonfiguration, um sicherzustellen, dass die Sitzung korrekt festgelegt wird. 2. Überprüfen Sie die Client -Cookies, bestätigen Sie, dass der Browser es unterstützt und korrekt senden. 3. Überprüfen Sie die Speicherdienste wie Redis, um sicherzustellen, dass sie normal arbeiten. 4. Überprüfen Sie den Anwendungscode, um die korrekte Sitzungslogik sicherzustellen. Durch diese Schritte können Konversationsprobleme effektiv diagnostiziert und repariert werden und die Benutzererfahrung verbessert werden.

Welche Bedeutung hat die Funktion Session_start ()?Welche Bedeutung hat die Funktion Session_start ()?May 03, 2025 am 12:18 AM

Session_Start () iscrucialinphPFormAnagingUSSERSIONS.1) ItinitiatesanewSessionifnoneExists, 2) Wiederaufnahmen und 3) setaSessionCookieforContinuityAcrossRequests, aktivierende Anwendungen wie

Was ist für die Festlegung der HTTPonly -Flag für Sitzungs Cookies wichtig?Was ist für die Festlegung der HTTPonly -Flag für Sitzungs Cookies wichtig?May 03, 2025 am 12:10 AM

Das Festlegen des HTTPonly -Flags ist für Sitzungscookies von entscheidender Bedeutung, da es effektiv verhindern und die Informationen zur Benutzersitzung schützen kann. Insbesondere 1) Das Httponly -Flag verhindert, dass JavaScript auf Cookies zugreift, 2) Das Flag kann durch SetCookies eingestellt werden und in PHP und Flasche 3), obwohl es nicht von allen Angriffen von allen Angriffen verhindert werden kann, Teil der Gesamtsicherheitsrichtlinie sein sollte.

Welches Problem lösen PHP -Sitzungen in der Webentwicklung?Welches Problem lösen PHP -Sitzungen in der Webentwicklung?May 03, 2025 am 12:02 AM

PhpSsionSsionSolvetheProblemofMaintainingStateAcrossmultipehttprequestsBoringDataontheserverandassociatingitittprequests.1) Sie starteten die Stundeataserver-Seite, typischerweise infileSordatabasen, undusaSasionIdinacookookookotenData

Welche Daten können in einer PHP -Sitzung gespeichert werden?Welche Daten können in einer PHP -Sitzung gespeichert werden?May 02, 2025 am 12:17 AM

PHPSSIONS CANSTORESTRINGEN, ZUGNALTEN, ARRAYS, ANDOBjekte.1.

Wie starten Sie eine PHP -Sitzung?Wie starten Sie eine PHP -Sitzung?May 02, 2025 am 12:16 AM

TostartaphpSession, useSession_start () atthescript'Sbeginning.1) PlaCEITBEFOREANYOUTPUTTOTHESESSIONSCOOKIE.2) useSsionsforuserDatalikeloginStatusOrShopingCarts

Was ist eine Sitzungsregeneration und wie verbessert es die Sicherheit?Was ist eine Sitzungsregeneration und wie verbessert es die Sicherheit?May 02, 2025 am 12:15 AM

Die Sitzung der Sitzung bezieht sich auf die Generierung einer neuen Sitzungs -ID und die Ungültigmachung der alten ID, wenn der Benutzer sensible Vorgänge bei festgelegten Sitzungsangriffen ausführt. Die Implementierungsschritte umfassen: 1. Erkennen sensibler Vorgänge, 2. Erstellen neuer Sitzungs-ID, 3..

See all articles

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

MantisBT

MantisBT

Mantis ist ein einfach zu implementierendes webbasiertes Tool zur Fehlerverfolgung, das die Fehlerverfolgung von Produkten unterstützen soll. Es erfordert PHP, MySQL und einen Webserver. Schauen Sie sich unsere Demo- und Hosting-Services an.

MinGW – Minimalistisches GNU für Windows

MinGW – Minimalistisches GNU für Windows

Dieses Projekt wird derzeit auf osdn.net/projects/mingw migriert. Sie können uns dort weiterhin folgen. MinGW: Eine native Windows-Portierung der GNU Compiler Collection (GCC), frei verteilbare Importbibliotheken und Header-Dateien zum Erstellen nativer Windows-Anwendungen, einschließlich Erweiterungen der MSVC-Laufzeit zur Unterstützung der C99-Funktionalität. Die gesamte MinGW-Software kann auf 64-Bit-Windows-Plattformen ausgeführt werden.

mPDF

mPDF

mPDF ist eine PHP-Bibliothek, die PDF-Dateien aus UTF-8-codiertem HTML generieren kann. Der ursprüngliche Autor, Ian Back, hat mPDF geschrieben, um PDF-Dateien „on the fly“ von seiner Website auszugeben und verschiedene Sprachen zu verarbeiten. Es ist langsamer und erzeugt bei der Verwendung von Unicode-Schriftarten größere Dateien als Originalskripte wie HTML2FPDF, unterstützt aber CSS-Stile usw. und verfügt über viele Verbesserungen. Unterstützt fast alle Sprachen, einschließlich RTL (Arabisch und Hebräisch) und CJK (Chinesisch, Japanisch und Koreanisch). Unterstützt verschachtelte Elemente auf Blockebene (wie P, DIV),

Herunterladen der Mac-Version des Atom-Editors

Herunterladen der Mac-Version des Atom-Editors

Der beliebteste Open-Source-Editor