常見加密解密(DES、RSA)以及摘要演算法MD5的介紹

来源:https://www.cnblogs.com/kimiliucn/archive/2023/08/05/17607330.html
-Advertisement-
Play Games

本文探討了MD5、DES和RAS的工作原理與特點。首先,MD5是一種不可逆的摘要演算法,它將任意長度的數據轉化為固定長度的摘要,用於數據完整性校驗。然而,由於其存在碰撞攻擊的漏洞,MD5已經不再被推薦作為安全加密演算法。其次,DES是一種對稱可逆的加密演算法,它使用相同的密鑰進行加密和解密,適用於保護數據... ...


一、MD5不可逆加密

1.1-理解MD5

  • MD5公開的演算法,任何語言實現後其實都是一樣的、通用的
  • 不可逆加密:原文——加密——密文,密文無法解密出原文

1.2-MD5封裝

using System.IO;
using System.Security.Cryptography;	

	/// <summary>
    /// 不可逆加密
    /// 1 防止被篡改
    /// 2 防止明文存儲
    /// 3 防止抵賴,數字簽名
    /// </summary>
    public class MD5Encrypt
    {
        #region MD5
        /// <summary>
        /// MD5加密,和動網上的16/32位MD5加密結果相同,
        /// 使用的UTF8編碼
        /// </summary>
        /// <param name="source">待加密字串</param>
        /// <param name="length">16或32值之一,其它則採用.net預設MD5加密演算法</param>
        /// <returns>加密後的字串</returns>
        public static string Encrypt(string source, int length = 32)//預設參數
        {
            if (string.IsNullOrEmpty(source)) return string.Empty;
            HashAlgorithm provider = CryptoConfig.CreateFromName("MD5") as HashAlgorithm;
            byte[] bytes = Encoding.UTF8.GetBytes(source);//這裡需要區別編碼的
            byte[] hashValue = provider.ComputeHash(bytes);
            StringBuilder sb = new StringBuilder();
            switch (length)
            {
                case 16://16位密文是32位密文的9到24位字元
                    for (int i = 4; i < 12; i++)
                    {
                        sb.Append(hashValue[i].ToString("x2"));
                    }
                    break;
                case 32:
                    for (int i = 0; i < 16; i++)
                    {
                        sb.Append(hashValue[i].ToString("x2"));
                    }
                    break;
                default:
                    for (int i = 0; i < hashValue.Length; i++)
                    {
                        sb.Append(hashValue[i].ToString("x2"));
                    }
                    break;
            }
            return sb.ToString();
        }
        #endregion MD5

        #region MD5摘要
        /// <summary>
        /// 獲取文件的MD5摘要
        /// </summary>
        /// <param name="fileName"></param>
        /// <returns></returns>
        public static string AbstractFile(string fileName)
        {
            using (FileStream file = new FileStream(fileName, FileMode.Open))
            {
                return AbstractFile(file);
            }
        }
        
        /// <summary>
        /// 根據stream獲取文件摘要
        /// </summary>
        /// <param name="stream"></param>
        /// <returns></returns>
        public static string AbstractFile(Stream stream)
        {
            MD5 md5 = new MD5CryptoServiceProvider();
            byte[] retVal = md5.ComputeHash(stream);

            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < retVal.Length; i++)
            {
                sb.Append(retVal[i].ToString("x2"));
            }
            return sb.ToString();
        }
        #endregion
    }

1.3-MD5總結

  • 相同原文加密的結果是一樣的
  • 不同長度的內容加密後都是32位,可以自行改變長度
  • 原文件改動差別很小,結果差別很大
  • 不管文件多大,都能產生32位長度的【摘要】,就是更具文件流進行加密的結果
    • 文件內容有一點改動,結果變化非常大
    • 文件內容不變,文件名變了,結果是不變的

1.4-MD5用途?

  1. 防篡改
    1. 源代碼管理器
    2. 急速秒傳
      1. 在本地進行MD5摘要,到伺服器上去檢查,如果存在就不需要上傳,直接在伺服器上複製一份,或者指向路徑跳轉一下。
  2. 密碼保存:防止看到明文
    1. 密文是可見的,所以要求密碼不能太檢查;加鹽(特殊字元+字母+數字)
    2. MD5是無法全部窮舉出來的,無法全部解密出來的,像網上有很多這種;

image.png

  1. 防止抵賴,數字簽名
    1. 吧一些內容摘要一下,不能抵賴。

二、對稱可逆加密DES

2.1-理解DES

  • 對稱可逆加密是公開的演算法,任何語言實現後其實都一樣,通用的。
  • 加密後能解密會原文,但是需要一個Key
  • 加密key和加密Key是同一個,也就是開門和鎖門都要用同一吧鑰匙
  • 優點:加密解密的速度快
  • 缺點:問題是秘鑰的安全(key在網路中傳輸唄竊取),不是很安全

理解什麼是對稱可逆加密:

  • 對稱:加密/解密是key要一模一樣的
  • 可逆:原文加密到密文,密文解密到原文

2.2-DES封裝

 	/// <summary>
    /// Des加密
    /// </summary>
    public class DesCrypto
    {

        //密鑰
        private const string sKey = "qJzGEh6hESZDVJeCnFPGuxzaiB7NLQM3";
        //矢量,矢量可以為空
        private const string sIV = "qcDY6X+aPLw=";


        //構造一個對稱演算法
        private SymmetricAlgorithm mCSP = new TripleDESCryptoServiceProvider();

        /// <summary>
        /// 構造函數
        /// </summary>
        public DesCrypto() {
        
        }

        #region public string EncryptString(string Value)
        /// <summary>
        /// 加密字元串
        /// </summary>
        /// <param name="Value">輸入的字元串</param>
        /// <returns>加密後的字元串</returns>
        public string EncryptString(string Value)
        {
            ICryptoTransform ct;
            MemoryStream ms;
            CryptoStream cs;
            byte[] byt;
            mCSP.Key = Convert.FromBase64String(sKey);
            mCSP.IV = Convert.FromBase64String(sIV);
            //指定加密的運算模式
            mCSP.Mode = System.Security.Cryptography.CipherMode.ECB;
            //獲取或設置加密演算法的填充模式
            mCSP.Padding = System.Security.Cryptography.PaddingMode.PKCS7;
            ct = mCSP.CreateEncryptor(mCSP.Key, mCSP.IV);
            byt = Encoding.UTF8.GetBytes(Value);
            ms = new MemoryStream();
            cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);
            cs.Write(byt, 0, byt.Length);
            cs.FlushFinalBlock();
            cs.Close();
            return Convert.ToBase64String(ms.ToArray());
        }
        #endregion


        #region public string DecryptString(string Value)
        /// <summary>
        /// 解密字元串
        /// </summary>
        /// <param name="Value">加過密的字元串</param>
        /// <returns>解密後的字元串</returns>
        public string DecryptString(string Value)
        {
            ICryptoTransform ct;
            MemoryStream ms;
            CryptoStream cs;
            byte[] byt;
            mCSP.Key = Convert.FromBase64String(sKey);
            mCSP.IV = Convert.FromBase64String(sIV);
            mCSP.Mode = System.Security.Cryptography.CipherMode.ECB;
            mCSP.Padding = System.Security.Cryptography.PaddingMode.PKCS7;
            ct = mCSP.CreateDecryptor(mCSP.Key, mCSP.IV);
            byt = Convert.FromBase64String(Value);
            ms = new MemoryStream();
            cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);
            cs.Write(byt, 0, byt.Length);
            cs.FlushFinalBlock();
            cs.Close();
            return Encoding.UTF8.GetString(ms.ToArray());
        }
        #endregion
    }

三、非對稱可逆加密RSA

2.1-理解RSA

  • 非對稱可逆加密公開的演算法,任何語言實現後其實都一樣,通用的;
  • 加密key和解密key不是一個,而是一對
  • 加密key和解密key不能相互推到,有密文,沒有解密key,也推導不出原文
  • 缺點:速度不快
  • 優點:安全性好

2.2-RSA封裝

/// <summary>
    /// RSA加密解密及RSA簽名和驗證
    /// </summary>
    public class RsaEncrypt
    {

        public RsaEncrypt()
        {
        }

        #region RSA 的密鑰產生
        /// <summary>
        /// RSA 的密鑰產生 產生私鑰 和公鑰
        /// </summary>
        /// <param name="xmlKeys"></param>
        /// <param name="xmlPublicKey"></param>
        public void RSAKey(out string xmlKeys, out string xmlPublicKey)
        {
            System.Security.Cryptography.RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
            xmlKeys = rsa.ToXmlString(true);
            xmlPublicKey = rsa.ToXmlString(false);
        }
        #endregion


        #region RSA的加密函數
        //##############################################################################
        //RSA 方式加密
        //說明KEY必須是XML的行式,返回的是字元串
        //在有一點需要說明!!該加密方式有 長度 限制的!!
        //##############################################################################

        //RSA的加密函數  string
        public string RSAEncrypt(string xmlPublicKey, string m_strEncryptString)
        {

            byte[] PlainTextBArray;
            byte[] CypherTextBArray;
            string Result;
            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
            rsa.FromXmlString(xmlPublicKey);
            PlainTextBArray = (new UnicodeEncoding()).GetBytes(m_strEncryptString);
            CypherTextBArray = rsa.Encrypt(PlainTextBArray, false);
            Result = Convert.ToBase64String(CypherTextBArray);
            return Result;

        }

        //RSA的加密函數 byte[]
        public string RSAEncrypt(string xmlPublicKey, byte[] EncryptString)
        {

            byte[] CypherTextBArray;
            string Result;
            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
            rsa.FromXmlString(xmlPublicKey);
            CypherTextBArray = rsa.Encrypt(EncryptString, false);
            Result = Convert.ToBase64String(CypherTextBArray);
            return Result;
        }
        #endregion


        #region RSA的解密函數
        //RSA的解密函數  string
        public string RSADecrypt(string xmlPrivateKey, string m_strDecryptString)
        {
            byte[] PlainTextBArray;
            byte[] DypherTextBArray;
            string Result;
            System.Security.Cryptography.RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
            rsa.FromXmlString(xmlPrivateKey);
            PlainTextBArray = Convert.FromBase64String(m_strDecryptString);
            DypherTextBArray = rsa.Decrypt(PlainTextBArray, false);
            Result = (new UnicodeEncoding()).GetString(DypherTextBArray);
            return Result;
        }

        //RSA的解密函數  byte
        public string RSADecrypt(string xmlPrivateKey, byte[] DecryptString)
        {
            byte[] DypherTextBArray;
            string Result;
            System.Security.Cryptography.RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
            rsa.FromXmlString(xmlPrivateKey);
            DypherTextBArray = rsa.Decrypt(DecryptString, false);
            Result = (new UnicodeEncoding()).GetString(DypherTextBArray);
            return Result;

        }
        #endregion


        #region RSA數字簽名
            #region 獲取Hash描述表
            //獲取Hash描述表 ,outofmemory.cn
            public bool GetHash(string m_strSource, ref byte[] HashData)
            {
                //從字元串中取得Hash描述
                byte[] Buffer;
                System.Security.Cryptography.HashAlgorithm MD5 = System.Security.Cryptography.HashAlgorithm.Create("MD5");
                Buffer = System.Text.Encoding.GetEncoding("GB2312").GetBytes(m_strSource);
                HashData = MD5.ComputeHash(Buffer);

                return true;
            }

            //獲取Hash描述表
            public bool GetHash(string m_strSource, ref string strHashData)
            {

                //從字元串中取得Hash描述
                byte[] Buffer;
                byte[] HashData;
                System.Security.Cryptography.HashAlgorithm MD5 = System.Security.Cryptography.HashAlgorithm.Create("MD5");
                Buffer = System.Text.Encoding.GetEncoding("GB2312").GetBytes(m_strSource);
                HashData = MD5.ComputeHash(Buffer);

                strHashData = Convert.ToBase64String(HashData);
                return true;

            }

            //獲取Hash描述表
            public bool GetHash(System.IO.FileStream objFile, ref byte[] HashData)
            {

                //從文件中取得Hash描述
                System.Security.Cryptography.HashAlgorithm MD5 = System.Security.Cryptography.HashAlgorithm.Create("MD5");
                HashData = MD5.ComputeHash(objFile);
                objFile.Close();

                return true;

            }

            //獲取Hash描述表
            public bool GetHash(System.IO.FileStream objFile, ref string strHashData)
            {

                //從文件中取得Hash描述
                byte[] HashData;
                System.Security.Cryptography.HashAlgorithm MD5 = System.Security.Cryptography.HashAlgorithm.Create("MD5");
                HashData = MD5.ComputeHash(objFile);
                objFile.Close();

                strHashData = Convert.ToBase64String(HashData);

                return true;

            }
            #endregion

            #region RSA簽名
            //RSA簽名
            public bool SignatureFormatter(string p_strKeyPrivate, byte[] HashbyteSignature, ref byte[] EncryptedSignatureData)
            {

                System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider();

                RSA.FromXmlString(p_strKeyPrivate);
                System.Security.Cryptography.RSAPKCS1SignatureFormatter RSAFormatter = new System.Security.Cryptography.RSAPKCS1SignatureFormatter(RSA);
                //設置簽名的演算法為MD5
                RSAFormatter.SetHashAlgorithm("MD5");
                //執行簽名
                EncryptedSignatureData = RSAFormatter.CreateSignature(HashbyteSignature);

                return true;

            }

            //RSA簽名
            public bool SignatureFormatter(string p_strKeyPrivate, byte[] HashbyteSignature, ref string m_strEncryptedSignatureData)
            {

                byte[] EncryptedSignatureData;

                System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider();

                RSA.FromXmlString(p_strKeyPrivate);
                System.Security.Cryptography.RSAPKCS1SignatureFormatter RSAFormatter = new System.Security.Cryptography.RSAPKCS1SignatureFormatter(RSA);
                //設置簽名的演算法為MD5
                RSAFormatter.SetHashAlgorithm("MD5");
                //執行簽名
                EncryptedSignatureData = RSAFormatter.CreateSignature(HashbyteSignature);

                m_strEncryptedSignatureData = Convert.ToBase64String(EncryptedSignatureData);

                return true;

            }

            //RSA簽名
            public bool SignatureFormatter(string p_strKeyPrivate, string m_strHashbyteSignature, ref byte[] EncryptedSignatureData)
            {

                byte[] HashbyteSignature;

                HashbyteSignature = Convert.FromBase64String(m_strHashbyteSignature);
                System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider();

                RSA.FromXmlString(p_strKeyPrivate);
                System.Security.Cryptography.RSAPKCS1SignatureFormatter RSAFormatter = new System.Security.Cryptography.RSAPKCS1SignatureFormatter(RSA);
                //設置簽名的演算法為MD5
                RSAFormatter.SetHashAlgorithm("MD5");
                //執行簽名
                EncryptedSignatureData = RSAFormatter.CreateSignature(HashbyteSignature);

                return true;

            }

            //RSA簽名
            public bool SignatureFormatter(string p_strKeyPrivate, string m_strHashbyteSignature, ref string m_strEncryptedSignatureData)
            {

                byte[] HashbyteSignature;
                byte[] EncryptedSignatureData;

                HashbyteSignature = Convert.FromBase64String(m_strHashbyteSignature);
                System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider();

                RSA.FromXmlString(p_strKeyPrivate);
                System.Security.Cryptography.RSAPKCS1SignatureFormatter RSAFormatter = new System.Security.Cryptography.RSAPKCS1SignatureFormatter(RSA);
                //設置簽名的演算法為MD5
                RSAFormatter.SetHashAlgorithm("MD5");
                //執行簽名
                EncryptedSignatureData = RSAFormatter.CreateSignature(HashbyteSignature);

                m_strEncryptedSignatureData = Convert.ToBase64String(EncryptedSignatureData);

                return true;

            }
            #endregion

            #region RSA 簽名驗證
            public bool SignatureDeformatter(string p_strKeyPublic, byte[] HashbyteDeformatter, byte[] DeformatterData)
            {

                System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider();

                RSA.FromXmlString(p_strKeyPublic);
                System.Security.Cryptography.RSAPKCS1SignatureDeformatter RSADeformatter = new System.Security.Cryptography.RSAPKCS1SignatureDeformatter(RSA);
                //指定解密的時候HASH演算法為MD5
                RSADeformatter.SetHashAlgorithm("MD5");

                if (RSADeformatter.VerifySignature(HashbyteDeformatter, DeformatterData))
                {
                    return true;
                }
                else
                {
                    return false;
                }

            }

            public bool SignatureDeformatter(string p_strKeyPublic, string p_strHashbyteDeformatter, byte[] DeformatterData)
            {

                byte[] HashbyteDeformatter;

                HashbyteDeformatter = Convert.FromBase64String(p_strHashbyteDeformatter);

                System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider();

                RSA.FromXmlString(p_strKeyPublic);
                System.Security.Cryptography.RSAPKCS1SignatureDeformatter RSADeformatter = new System.Security.Cryptography.RSAPKCS1SignatureDeformatter(RSA);
                //指定解密的時候HASH演算法為MD5
                RSADeformatter.SetHashAlgorithm("MD5");

                if (RSADeformatter.VerifySignature(HashbyteDeformatter, DeformatterData))
                {
                    return true;
                }
                else
                {
                    return false;
                }

            }

            public bool SignatureDeformatter(string p_strKeyPublic, byte[] HashbyteDeformatter, string p_strDeformatterData)
            {

                byte[] DeformatterData;

                System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider();

                RSA.FromXmlString(p_strKeyPublic);
                System.Security.Cryptography.RSAPKCS1SignatureDeformatter RSADeformatter = new System.Security.Cryptography.RSAPKCS1SignatureDeformatter(RSA);
                //指定解密的時候HASH演算法為MD5
                RSADeformatter.SetHashAlgorithm("MD5");

                DeformatterData = Convert.FromBase64String(p_strDeformatterData);

                if (RSADeformatter.VerifySignature(HashbyteDeformatter, DeformatterData))
                {
                    return true;
                }
                else
                {
                    return false;
                }

            }

            public bool SignatureDeformatter(string p_strKeyPublic, string p_strHashbyteDeformatter, string p_strDeformatterData)
            {

                byte[] DeformatterData;
                byte[] HashbyteDeformatter;

                HashbyteDeformatter = Convert.FromBase64String(p_strHashbyteDeformatter);
                System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider();

                RSA.FromXmlString(p_strKeyPublic);
                System.Security.Cryptography.RSAPKCS1SignatureDeformatter RSADeformatter = new System.Security.Cryptography.RSAPKCS1SignatureDeformatter(RSA);
                //指定解密的時候HASH演算法為MD5
                RSADeformatter.SetHashAlgorithm("MD5");

                DeformatterData = Convert.FromBase64String(p_strDeformatterData);

                if (RSADeformatter.VerifySignature(HashbyteDeformatter, DeformatterData))
                {
                    return true;
                }
                else
                {
                    return false;
                }

            }
            #endregion
        #endregion
    }

2.3-公鑰/私鑰

  • 公鑰:公開的Key
  • 私鑰:不公開的Key
  • 公開加密Key——>保證數據的安全傳遞
  • 公開解密Key——>保證數據的不可抵賴
  • C#內置實現了公鑰加密/私鑰解密,如果想要用第三方的DLL-BounccyCastle

image.png
image.png


四、數字證書

2.1-CA證書

image.png


2.2-單邊認證https

image.png


2.3-雙邊認證

image.png
image.png


原文鏈接:https://www.cnblogs.com/kimiliucn/p/17607330.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ## 什麼是Go? - Go是一個跨平臺、開源的編程語言 - Go可用於創建高性能應用程式 - Go是一種快速、靜態類型、編譯型語言,感覺上像動態類型、解釋型語言 - Go由Robert Griesemer、Rob Pike和Ken Thompson於2007年在Google開發 - Go的語法類似 ...
  • SPI是JDK內置的服務提供載入機制,可以為服務介面載入實現類,解耦是其核心思想,也是很多框架和組件的常用手段; ...
  • **作為程式員要求掌握最基本的windows相關的DOS命令(詳細版)** # 一、DOS命令、cmd、windows操作系統中保留的DOS命令分別是什麼? > **1.DOS命令是什麼?** > > - DOS命令,電腦術語,是指DOS操作系統的命令,是一種面向磁碟的操作命令,主要包括目錄操作類 ...
  • 1.Hash函數(別名:散列函數,又叫Hash演算法) Hash函數指將哈希表中元素的關鍵鍵值映射為元素存儲位置的函數。 把任意長度的輸入通過散列演算法變換成固定長度的輸出,該輸出就是散列值。 散列值的空間通常遠小於輸入的空間,不同的輸入可能會散列成相同的輸出,所以不可能從散列值來確定唯一的輸入值。因此 ...
  • # Unity 編輯器選擇器工具類Selection 常用函數和用法 [![https://github.com/AlianBlank/download.unity.com](https://img2023.cnblogs.com/other/406187/202308/406187-2023080 ...
  • # 個人博客-首頁排版優化-2 原本這篇文章早就要出了的,結果之前買的伺服器服務商跑路了,導致博客的數據缺失了部分。我是買了一年的伺服器,然後用了3個月,國內跑路雲太多了,然後也是花錢重新去別的服務商買了一臺伺服器,這次只買了一個月,先試試水。 # 優化計劃 - [x] 置頂3個且可滾動或切換 - ...
  • [toc] # 作用 - 在請求AuthorizeFilter -> ResourceFilter -> ActionFilter, 可以Action的日誌 - ActionFilter 在控制器實例化之後執行 - ResourceFilter 可以在全局, Controller, Action 都 ...
  • ASP.NET Framework WebAPI是一種強大的框架,用於構建基於HTTP協議的Web服務。它提供了一種簡單而靈活的方式來創建和發佈RESTful風格的API。通過使用WebAPI,開發人員可以輕鬆地將現有的應用程式或服務暴露為可訪問的Web API,從而實現數據的交互和共用。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...