


Von WeChat entwickelte Nachrichtentextsignatur sowie Verschlüsselung und Entschlüsselung
Die ersten Artikel dienen hauptsächlich der Vorbereitung der WeChat-Entwicklung und enthalten keinen technischen Inhalt. Im ersten und zweiten Artikel habe ich hauptsächlich über die Verwendung von Peanut Shell gesprochen, um beim Code-Debuggen mit VS zusammenzuarbeiten. Ich wurde einmal von Gartenfreunden beschwert, dass ich von Peanut Shell zum Scherz eingeladen wurde . Grenzen, bevor ich den Text dieses Artikels betrete, möchte ich ngrok vorstellen, ein Werkzeug, das nützlicher ist als Erdnussschalen. Ich werde die Vorteile von ngrok hier nicht im Detail erläutern Artikel
Aus Sicherheitsgründen hat die öffentliche WeChat-Plattform im Oktober die Funktion zur Verschlüsselung und Entschlüsselung des Nachrichtentexts hinzugefügt. Zunächst muss die Signatur überprüft werden, die von der öffentlichen Plattform und den öffentlichen Konten zur Überprüfung der Richtigkeit verwendet wird Zweitens müssen normale Nachrichten, die an öffentliche Konten gesendet werden, und Ereignisnachrichten sowie die an das öffentliche Konto des Geräts gesendeten Nachrichten verschlüsselt werden. Schließlich muss auch die Antwort des öffentlichen Kontos auf die Chiffretextnachricht verschlüsselt werden . Nachdem die Verschlüsselungs- und Entschlüsselungsfunktion aktiviert wurde und der offizielle Plattformserver eine Nachricht an die konfigurierte Adresse des offiziellen Kontoservers sendet, wird die URL hinzugefügt und zwei Parameter hinzugefügt, einer ist der Verschlüsselungstyp und der andere ist die Signatur des Nachrichtentextes und spiegelt die neuen Funktionen wider. Der Verschlüsselungsalgorithmus verwendet AES. Anweisungen zum Klartextmodus, zum Kompatibilitätsmodus und zum Sicherheitsmodus finden Sie in der offiziellen Dokumentation.
Die offizielle Demo dient zur Überprüfung der Nachrichtenauthentizität sowie der Verschlüsselung und Entschlüsselung Ich werde nicht auf Details eingehen. Sie können es direkt nach dem Herunterladen aufrufen:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Security.Cryptography;using System.IO;using System.Net;namespace WxApi { public class Cryptography { public static UInt32 HostToNetworkOrder(UInt32 inval) { UInt32 outval = 0; for (int i = 0; i < 4; i++) outval = (outval << 8) + ((inval >> (i * 8)) & 255); return outval; } public static Int32 HostToNetworkOrder(Int32 inval) { Int32 outval = 0; for (int i = 0; i < 4; i++) outval = (outval << 8) + ((inval >> (i * 8)) & 255); return outval; } /// <summary> /// 解密方法 /// </summary> /// <param name="Input">密文</param> /// <param name="EncodingAESKey"></param> /// <returns></returns> /// public static string AES_decrypt(String Input, string EncodingAESKey, ref string appid) { byte[] Key; Key = Convert.FromBase64String(EncodingAESKey + "="); byte[] Iv = new byte[16]; Array.Copy(Key, Iv, 16); byte[] btmpMsg = AES_decrypt(Input, Iv, Key); int len = BitConverter.ToInt32(btmpMsg, 16); len = IPAddress.NetworkToHostOrder(len); byte[] bMsg = new byte[len]; byte[] bAppid = new byte[btmpMsg.Length - 20 - len]; Array.Copy(btmpMsg, 20, bMsg, 0, len); Array.Copy(btmpMsg, 20 + len, bAppid, 0, btmpMsg.Length - 20 - len); string oriMsg = Encoding.UTF8.GetString(bMsg); appid = Encoding.UTF8.GetString(bAppid); return oriMsg; } public static String AES_encrypt(String Input, string EncodingAESKey, string appid) { byte[] Key; Key = Convert.FromBase64String(EncodingAESKey + "="); byte[] Iv = new byte[16]; Array.Copy(Key, Iv, 16); string Randcode = CreateRandCode(16); byte[] bRand = Encoding.UTF8.GetBytes(Randcode); byte[] bAppid = Encoding.UTF8.GetBytes(appid); byte[] btmpMsg = Encoding.UTF8.GetBytes(Input); byte[] bMsgLen = BitConverter.GetBytes(HostToNetworkOrder(btmpMsg.Length)); byte[] bMsg = new byte[bRand.Length + bMsgLen.Length + bAppid.Length + btmpMsg.Length]; Array.Copy(bRand, bMsg, bRand.Length); Array.Copy(bMsgLen, 0, bMsg, bRand.Length, bMsgLen.Length); Array.Copy(btmpMsg, 0, bMsg, bRand.Length + bMsgLen.Length, btmpMsg.Length); Array.Copy(bAppid, 0, bMsg, bRand.Length + bMsgLen.Length + btmpMsg.Length, bAppid.Length); return AES_encrypt(bMsg, Iv, Key); } private static string CreateRandCode(int codeLen) { string codeSerial = "2,3,4,5,6,7,a,c,d,e,f,h,i,j,k,m,n,p,r,s,t,A,C,D,E,F,G,H,J,K,M,N,P,Q,R,S,U,V,W,X,Y,Z"; if (codeLen == 0) { codeLen = 16; } string[] arr = codeSerial.Split(','); string code = ""; int randValue = -1; Random rand = new Random(unchecked((int)DateTime.Now.Ticks)); for (int i = 0; i < codeLen; i++) { randValue = rand.Next(0, arr.Length - 1); code += arr[randValue]; } return code; } private static String AES_encrypt(String Input, byte[] Iv, byte[] Key) { var aes = new RijndaelManaged(); //秘钥的大小,以位为单位 aes.KeySize = 256; //支持的块大小 aes.BlockSize = 128; //填充模式 aes.Padding = PaddingMode.PKCS7; aes.Mode = CipherMode.CBC; aes.Key = Key; aes.IV = Iv; var encrypt = aes.CreateEncryptor(aes.Key, aes.IV); byte[] xBuff = null; using (var ms = new MemoryStream()) { using (var cs = new CryptoStream(ms, encrypt, CryptoStreamMode.Write)) { byte[] xXml = Encoding.UTF8.GetBytes(Input); cs.Write(xXml, 0, xXml.Length); } xBuff = ms.ToArray(); } String Output = Convert.ToBase64String(xBuff); return Output; } private static String AES_encrypt(byte[] Input, byte[] Iv, byte[] Key) { var aes = new RijndaelManaged(); //秘钥的大小,以位为单位 aes.KeySize = 256; //支持的块大小 aes.BlockSize = 128; //填充模式 //aes.Padding = PaddingMode.PKCS7; aes.Padding = PaddingMode.None; aes.Mode = CipherMode.CBC; aes.Key = Key; aes.IV = Iv; var encrypt = aes.CreateEncryptor(aes.Key, aes.IV); byte[] xBuff = null; #region 自己进行PKCS7补位,用系统自己带的不行 byte[] msg = new byte[Input.Length + 32 - Input.Length % 32]; Array.Copy(Input, msg, Input.Length); byte[] pad = KCS7Encoder(Input.Length); Array.Copy(pad, 0, msg, Input.Length, pad.Length); #endregion #region 注释的也是一种方法,效果一样 //ICryptoTransform transform = aes.CreateEncryptor(); //byte[] xBuff = transform.TransformFinalBlock(msg, 0, msg.Length); #endregion using (var ms = new MemoryStream()) { using (var cs = new CryptoStream(ms, encrypt, CryptoStreamMode.Write)) { cs.Write(msg, 0, msg.Length); } xBuff = ms.ToArray(); } String Output = Convert.ToBase64String(xBuff); return Output; } private static byte[] KCS7Encoder(int text_length) { int block_size = 32; // 计算需要填充的位数 int amount_to_pad = block_size - (text_length % block_size); if (amount_to_pad == 0) { amount_to_pad = block_size; } // 获得补位所用的字符 char pad_chr = chr(amount_to_pad); string tmp = ""; for (int index = 0; index < amount_to_pad; index++) { tmp += pad_chr; } return Encoding.UTF8.GetBytes(tmp); } /** * 将数字转化成ASCII码对应的字符,用于对明文进行补码 * * @param a 需要转化的数字 * @return 转化得到的字符 */ static char chr(int a) { byte target = (byte)(a & 0xFF); return (char)target; } private static byte[] AES_decrypt(String Input, byte[] Iv, byte[] Key) { RijndaelManaged aes = new RijndaelManaged(); aes.KeySize = 256; aes.BlockSize = 128; aes.Mode = CipherMode.CBC; aes.Padding = PaddingMode.None; aes.Key = Key; aes.IV = Iv; var decrypt = aes.CreateDecryptor(aes.Key, aes.IV); byte[] xBuff = null; using (var ms = new MemoryStream()) { using (var cs = new CryptoStream(ms, decrypt, CryptoStreamMode.Write)) { byte[] xXml = Convert.FromBase64String(Input); byte[] msg = new byte[xXml.Length + 32 - xXml.Length % 32]; Array.Copy(xXml, msg, xXml.Length); cs.Write(xXml, 0, xXml.Length); } xBuff = decode2(ms.ToArray()); } return xBuff; } private static byte[] decode2(byte[] decrypted) { int pad = (int)decrypted[decrypted.Length - 1]; if (pad < 1 || pad > 32) { pad = 0; } byte[] res = new byte[decrypted.Length - pad]; Array.Copy(decrypted, 0, res, 0, decrypted.Length - pad); return res; } } }
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Xml;using System.Collections;//using System.Web;using System.Security.Cryptography;//-40001 : 签名验证错误//-40002 : xml解析失败//-40003 : sha加密生成签名失败//-40004 : AESKey 非法//-40005 : appid 校验错误//-40006 : AES 加密失败//-40007 : AES 解密失败//-40008 : 解密后得到的buffer非法//-40009 : base64加密异常//-40010 : base64解密异常namespace WxApi { public class MsgCrypt { string m_sToken; string m_sEncodingAESKey; string m_sAppID; enum WXBizMsgCryptErrorCode { WXBizMsgCrypt_OK = 0, WXBizMsgCrypt_ValidateSignature_Error = -40001, WXBizMsgCrypt_ParseXml_Error = -40002, WXBizMsgCrypt_ComputeSignature_Error = -40003, WXBizMsgCrypt_IllegalAesKey = -40004, WXBizMsgCrypt_ValidateAppid_Error = -40005, WXBizMsgCrypt_EncryptAES_Error = -40006, WXBizMsgCrypt_DecryptAES_Error = -40007, WXBizMsgCrypt_IllegalBuffer = -40008, WXBizMsgCrypt_EncodeBase64_Error = -40009, WXBizMsgCrypt_DecodeBase64_Error = -40010 }; //构造函数 // @param sToken: 公众平台上,开发者设置的Token // @param sEncodingAESKey: 公众平台上,开发者设置的EncodingAESKey // @param sAppID: 公众帐号的appid public MsgCrypt(string sToken, string sEncodingAESKey, string sAppID) { m_sToken = sToken; m_sAppID = sAppID; m_sEncodingAESKey = sEncodingAESKey; } // 检验消息的真实性,并且获取解密后的明文 // @param sMsgSignature: 签名串,对应URL参数的msg_signature // @param sTimeStamp: 时间戳,对应URL参数的timestamp // @param sNonce: 随机串,对应URL参数的nonce // @param sPostData: 密文,对应POST请求的数据 // @param sMsg: 解密后的原文,当return返回0时有效 // @return: 成功0,失败返回对应的错误码 public int DecryptMsg(string sMsgSignature, string sTimeStamp, string sNonce, string sPostData, ref string sMsg) { if (m_sEncodingAESKey.Length != 43) { return (int)WXBizMsgCryptErrorCode.WXBizMsgCrypt_IllegalAesKey; } XmlDocument doc = new XmlDocument(); XmlNode root; string sEncryptMsg; try { doc.LoadXml(sPostData); root = doc.FirstChild; sEncryptMsg = root["Encrypt"].InnerText; } catch (Exception) { return (int)WXBizMsgCryptErrorCode.WXBizMsgCrypt_ParseXml_Error; } //verify signature int ret = 0; ret = VerifySignature(m_sToken, sTimeStamp, sNonce, sEncryptMsg, sMsgSignature); if (ret != 0) return ret; //decrypt string cpid = ""; try { sMsg = Cryptography.AES_decrypt(sEncryptMsg, m_sEncodingAESKey, ref cpid); } catch (FormatException) { return (int)WXBizMsgCryptErrorCode.WXBizMsgCrypt_DecodeBase64_Error; } catch (Exception) { return (int)WXBizMsgCryptErrorCode.WXBizMsgCrypt_DecryptAES_Error; } if (cpid != m_sAppID) return (int)WXBizMsgCryptErrorCode.WXBizMsgCrypt_ValidateAppid_Error; return 0; } //将企业号回复用户的消息加密打包 // @param sReplyMsg: 企业号待回复用户的消息,xml格式的字符串 // @param sTimeStamp: 时间戳,可以自己生成,也可以用URL参数的timestamp // @param sNonce: 随机串,可以自己生成,也可以用URL参数的nonce // @param sEncryptMsg: 加密后的可以直接回复用户的密文,包括msg_signature, timestamp, nonce, encrypt的xml格式的字符串, // 当return返回0时有效 // return:成功0,失败返回对应的错误码 public int EncryptMsg(string sReplyMsg, string sTimeStamp, string sNonce, ref string sEncryptMsg) { if (m_sEncodingAESKey.Length != 43) { return (int)WXBizMsgCryptErrorCode.WXBizMsgCrypt_IllegalAesKey; } string raw = ""; try { raw = Cryptography.AES_encrypt(sReplyMsg, m_sEncodingAESKey, m_sAppID); } catch (Exception) { return (int)WXBizMsgCryptErrorCode.WXBizMsgCrypt_EncryptAES_Error; } string MsgSigature = ""; int ret = 0; ret = GenarateSinature(m_sToken, sTimeStamp, sNonce, raw, ref MsgSigature); if (0 != ret) return ret; sEncryptMsg = ""; string EncryptLabelHead = "<Encrypt><![CDATA["; string EncryptLabelTail = "]]></Encrypt>"; string MsgSigLabelHead = "<MsgSignature><![CDATA["; string MsgSigLabelTail = "]]></MsgSignature>"; string TimeStampLabelHead = "<TimeStamp><![CDATA["; string TimeStampLabelTail = "]]></TimeStamp>"; string NonceLabelHead = "<Nonce><![CDATA["; string NonceLabelTail = "]]></Nonce>"; sEncryptMsg = sEncryptMsg + "<xml>" + EncryptLabelHead + raw + EncryptLabelTail; sEncryptMsg = sEncryptMsg + MsgSigLabelHead + MsgSigature + MsgSigLabelTail; sEncryptMsg = sEncryptMsg + TimeStampLabelHead + sTimeStamp + TimeStampLabelTail; sEncryptMsg = sEncryptMsg + NonceLabelHead + sNonce + NonceLabelTail; sEncryptMsg += "</xml>"; return 0; } public class DictionarySort : System.Collections.IComparer { public int Compare(object oLeft, object oRight) { string sLeft = oLeft as string; string sRight = oRight as string; int iLeftLength = sLeft.Length; int iRightLength = sRight.Length; int index = 0; while (index < iLeftLength && index < iRightLength) { if (sLeft[index] < sRight[index]) return -1; else if (sLeft[index] > sRight[index]) return 1; else index++; } return iLeftLength - iRightLength; } } //Verify Signature private static int VerifySignature(string sToken, string sTimeStamp, string sNonce, string sMsgEncrypt, string sSigture) { string hash = ""; int ret = 0; ret = GenarateSinature(sToken, sTimeStamp, sNonce, sMsgEncrypt, ref hash); if (ret != 0) return ret; //System.Console.WriteLine(hash); if (hash == sSigture) return 0; else { return (int)WXBizMsgCryptErrorCode.WXBizMsgCrypt_ValidateSignature_Error; } } public static int GenarateSinature(string sToken, string sTimeStamp, string sNonce, string sMsgEncrypt, ref string sMsgSignature) { ArrayList AL = new ArrayList(); AL.Add(sToken); AL.Add(sTimeStamp); AL.Add(sNonce); AL.Add(sMsgEncrypt); AL.Sort(new DictionarySort()); string raw = ""; for (int i = 0; i < AL.Count; ++i) { raw += AL[i]; } SHA1 sha; ASCIIEncoding enc; string hash = ""; try { sha = new SHA1CryptoServiceProvider(); enc = new ASCIIEncoding(); byte[] dataToHash = enc.GetBytes(raw); byte[] dataHashed = sha.ComputeHash(dataToHash); hash = BitConverter.ToString(dataHashed).Replace("-", ""); hash = hash.ToLower(); } catch (Exception) { return (int)WXBizMsgCryptErrorCode.WXBizMsgCrypt_ComputeSignature_Error; } sMsgSignature = hash; return 0; } } }
Im Verarbeitungsprogramm werden zunächst die vom öffentlichen Plattformserver gesendeten Daten abgerufen Wandeln Sie es in einen String um. Der Code lautet wie folgt:
string postStr = ""; Stream s = VqiRequest.GetInputStream();//此方法是对System.Web.HttpContext.Current.Request.InputStream的封装,可直接代码 byte[] b = new byte[s.Length]; s.Read(b, 0, (int)s.Length); postStr = Encoding.UTF8.GetString(b);
und erhält dann die Parameter in der URL: Zeitstempel, Nonce, msg_signature, encrypt_type. Wie Sie sehen, gibt es im Klartextmodus keinen encrypt_type-Parameter. Wie im Bild gezeigt:
Klartextmodus
Kompatibilitätsmodus und abgesicherter Modus
Kompatibilitätsmodus und Sicherheitsmodus fügen zwei Parameter hinzu: die Signatur und den Verschlüsselungstyp des Nachrichtentexts.
Da es unwahrscheinlich ist, dass der Kompatibilitätsmodus im tatsächlichen Betrieb verwendet wird, werden wir ihn hier nicht im Detail vorstellen.
Fahren Sie mit dem oben Gesagten fort. Bestimmen Sie nach dem Abrufen der Parameter in der URL, ob der Wert von encrypt_type aes ist. Wenn dies der Fall ist, bedeutet dies, dass der Kompatibilitätsmodus oder der abgesicherte Modus verwendet wird. Zu diesem Zeitpunkt müssen Sie die entschlüsselungsbezogene Methode zur Entschlüsselung aufrufen.
if (encrypt_type == "aes") { requestXML.IsAes = true; requestXML.EncodingAESKey = aeskey; requestXML.token = token; requestXML.appid = appid; var ret = new MsgCrypt(token, aeskey, appid); int r = ret.DecryptMsg(msg_signature, timestamp, nonce, postStr, ref data); if (r!=0) { WxApi.Base.WriteBug("消息解密失败"); return null; } }
Andernfalls wird die empfangene XML-Zeichenfolge direkt analysiert.
Das Bild unten ist der empfangene Chiffretext:
Der entschlüsselte Inhalt ist wie folgt:
Diese XML kann derzeit analysiert werden.
Wenn Sie auf eine verschlüsselte Anfrage antworten müssen, muss auch der Inhalt der Antwort verschlüsselt werden. Daher müssen Sie vor der Antwort feststellen, ob die empfangene Nachricht verschlüsselt ist den Inhalt der Antwort und dann antworten. Die Methode zum Beantworten von Nachrichten wird im nächsten Artikel ausführlich erläutert. In diesem Artikel wird nur der Verschlüsselungsprozess erläutert.
Der Verarbeitungscode lautet wie folgt:
private static void Response(WeiXinRequest requestXML, string data) { if (requestXML.IsAes) { var wxcpt = new MsgCrypt(requestXML.token, requestXML.EncodingAESKey, requestXML.appid); wxcpt.EncryptMsg(data, Utils.ConvertDateTimeInt(DateTime.Now).ToString(), Utils.GetRamCode(), ref data); } Utils.ResponseWrite(data); }
Übergeben Sie die empfangene Nachrichtenentität und die zu beantwortende Inhalts-XML. Wenn sie verschlüsselt ist, antworten Sie nach der Verschlüsselung, andernfalls antworten Sie direkt .
[Verwandte Empfehlungen]
1.Quellcode der WeChat-Plattform für öffentliche Konten herunterladen
2.Weizhichuang T+ WeChat-Roboterquelle Code
Das obige ist der detaillierte Inhalt vonVon WeChat entwickelte Nachrichtentextsignatur sowie Verschlüsselung und Entschlüsselung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Normalerweise erhalten wir PDF-Dateien von der Regierung oder anderen Behörden, teilweise mit digitalen Signaturen. Nach der Überprüfung der Signatur sehen wir die Meldung SignatureValid und ein grünes Häkchen. Wenn die Signatur nicht überprüft wird, ist die Gültigkeit unbekannt. Die Überprüfung von Signaturen ist wichtig. Sehen wir uns an, wie das im PDF-Format geht. So überprüfen Sie Signaturen im PDF-Format. Durch die Überprüfung von Signaturen im PDF-Format wird das Dokument vertrauenswürdiger und die Wahrscheinlichkeit erhöht, dass es akzeptiert wird. Sie können Signaturen in PDF-Dokumenten auf folgende Weise überprüfen. Öffnen Sie die PDF-Datei im Adobe Reader. Klicken Sie mit der rechten Maustaste auf die Signatur und wählen Sie „Signatureigenschaften anzeigen“. Klicken Sie auf die Schaltfläche „Unterzeichnerzertifikat anzeigen“. Fügen Sie die Signatur auf der Registerkarte „Vertrauen“ zur Liste „Vertrauenswürdige Zertifikate“ hinzu. Klicken Sie auf „Signatur überprüfen“, um die Überprüfung abzuschließen

Gestern habe ich einen englischen Artikel [1] gesehen, der zeigte, wie man Python zur Implementierung des RSA-Algorithmus verwendet. Die Logik des Codes ist dieselbe wie im vorherigen Artikel. Den RSA-Algorithmus verstehen. Freunde, die mit RSA nicht vertraut sind, können den Artikel verstehen Es werden die mathematischen Prinzipien von RSA erklärt und ein einfaches Beispiel gegeben. Man kann sagen, dass dies der einfachste Artikel ist, um RSA auf Quanzhihu zu verstehen (dies stammt aus Leserkommentaren). Ich habe den auf Englisch bereitgestellten Code ausgeführt und festgestellt, dass Chinesisch nicht verschlüsselt werden konnte. Daher habe ich die Verschlüsselungs- und Entschlüsselungsfunktionen geändert, um die chinesische Verschlüsselung und Entschlüsselung zu unterstützen. Im heutigen Artikel erfahren Sie, wie Sie mit Python den RSA-Verschlüsselungs- und -Entschlüsselungsprozess implementieren, um Ihnen bei der Einrichtung zu helfen

Eine E-Mail-Signatur ist wichtig, um Legitimität und Professionalität zu demonstrieren und enthält Kontaktinformationen und das Firmenlogo. Outlook-Benutzer beschweren sich häufig darüber, dass Signaturen nach dem Neustart verschwinden, was für diejenigen, die die Sichtbarkeit ihres Unternehmens erhöhen möchten, frustrierend sein kann. In diesem Artikel werden wir verschiedene Lösungen zur Behebung dieses Problems untersuchen. Warum verschwinden meine Microsoft Outlook-Signaturen immer wieder? Wenn Sie Microsoft Outlook zum ersten Mal verwenden, stellen Sie sicher, dass es sich bei Ihrer Version nicht um eine Testversion handelt. Testversionen können dazu führen, dass Signaturen verschwinden. Darüber hinaus sollte die Versionsarchitektur auch mit der Versionsarchitektur des Betriebssystems übereinstimmen. Wenn Sie feststellen, dass Ihre E-Mail-Signatur von Zeit zu Zeit in Outlook Web App verschwindet, kann dies daran liegen

PHP8 ist die neueste Version von PHP und bietet Programmierern mehr Komfort und Funktionalität. Bei dieser Version liegt ein besonderer Schwerpunkt auf Sicherheit und Leistung, und eine der bemerkenswerten neuen Funktionen ist die Hinzufügung von Verifizierungs- und Signierungsfunktionen. In diesem Artikel werfen wir einen genaueren Blick auf diese neuen Funktionen und ihre Verwendung. Verifizierung und Signierung sind sehr wichtige Sicherheitskonzepte in der Informatik. Sie dienen häufig dazu, sicherzustellen, dass die übermittelten Daten vollständig und authentisch sind. Verifizierung und Signaturen werden beim Umgang mit Online-Transaktionen und sensiblen Informationen noch wichtiger, denn wenn jemand in der Lage ist, die Daten zu manipulieren, könnte dies möglicherweise der Fall sein

Mit der Entwicklung der Internettechnologie ist Sicherheit zu einem immer wichtigeren Thema geworden, insbesondere die Sicherheit der in Internetanwendungen übertragenen Daten. Die Signatur- und Signaturüberprüfungstechnologie ist zu einem wichtigen Mittel zur Gewährleistung der Datensicherheit geworden. PHP bietet als beliebte Internet-Programmiersprache auch verwandte Funktionen für die Signatur und Signaturüberprüfung in PHP. 1. Konzepte der Signatur und Signaturüberprüfung Unter Signatur versteht man die Verschlüsselung von Daten, um eine bestimmte Zeichenfolge basierend auf dem digitalen Signaturalgorithmus zu generieren. Die Daten können über diese Zeichenfolge überprüft werden

Methode und Anwendung der Signaturauthentifizierung in PHP Mit der Entwicklung des Internets ist die Sicherheit von Webanwendungen immer wichtiger geworden. Die Signaturauthentifizierung ist ein gängiger Sicherheitsmechanismus, mit dem die Legitimität von Anfragen überprüft und unbefugter Zugriff verhindert wird. In diesem Artikel werden die Signaturauthentifizierungsmethode und ihre Anwendung in PHP vorgestellt und Codebeispiele bereitgestellt. 1. Was ist Signaturauthentifizierung? Die Signaturauthentifizierung ist ein Überprüfungsmechanismus, der auf Schlüsseln und Algorithmen basiert. Die Anforderungsparameter werden verschlüsselt, um einen eindeutigen Signaturwert zu generieren. Anschließend entschlüsselt der Server die Anforderung und überprüft die Signatur mithilfe desselben Algorithmus und Schlüssels.

PHP ist eine Open-Source-Skriptsprache, die in der Webentwicklung und serverseitigen Programmierung, insbesondere in der WeChat-Entwicklung, weit verbreitet ist. Heutzutage beginnen immer mehr Unternehmen und Entwickler, PHP für die WeChat-Entwicklung zu verwenden, da es sich zu einer wirklich leicht zu erlernenden und benutzerfreundlichen Entwicklungssprache entwickelt hat. Bei der WeChat-Entwicklung sind die Nachrichtenverschlüsselung und -entschlüsselung ein sehr wichtiges Thema, da sie die Datensicherheit betreffen. Bei Nachrichten ohne Verschlüsselungs- und Entschlüsselungsmethoden können Hacker leicht an die Daten gelangen, was eine Bedrohung für Benutzer darstellt.

Mit der Popularität von WeChat beginnen immer mehr Unternehmen, es als Marketinginstrument zu nutzen. Die WeChat-Gruppen-Messaging-Funktion ist für Unternehmen eines der wichtigen Mittel zur Durchführung von WeChat-Marketing. Wenn Sie sich jedoch nur auf den manuellen Versand verlassen, ist dies für Vermarkter eine äußerst zeitaufwändige und mühsame Aufgabe. Daher ist es besonders wichtig, ein WeChat-Massen-Messaging-Tool zu entwickeln. In diesem Artikel wird erläutert, wie Sie mit PHP WeChat-Massen-Messaging-Tools entwickeln. 1. Vorbereitungsarbeiten Um WeChat-Massen-Messaging-Tools zu entwickeln, müssen wir die folgenden technischen Punkte beherrschen: Grundkenntnisse der PHP-Entwicklung der öffentlichen WeChat-Plattform Entwicklungstools: Sub
