成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

程序員必備基礎:加簽驗簽

安全 數據安全
非對稱加密算法需要兩個密鑰(公開密鑰和私有密鑰)。公鑰與私鑰是成對存在的,如果用公鑰對數據進行加密,只有對應的私鑰才能解密。

[[334205]]

密碼學相關概念

明文、密文、密鑰、加密、解密

  • 明文:指沒有經過加密的信息/數據。
  • 密文:明文被加密算法加密之后,會變成密文,以確保數據安全。
  • 密鑰:是一種參數,它是在明文轉換為密文或將密文轉換為明文的算法中輸入的參數。密鑰分為對稱密鑰與非對稱密鑰。
  • 加密:將明文變成密文的過程。
  • 解密:將密文還原為明文的過程。

對稱加密、非對稱加密

對稱加密:加密和解密使用相同密鑰的加密算法。

 

非對稱加密:非對稱加密算法需要兩個密鑰(公開密鑰和私有密鑰)。公鑰與私鑰是成對存在的,如果用公鑰對數據進行加密,只有對應的私鑰才能解密。

 

什么是公鑰私鑰?

公鑰與私鑰是成對存在的密鑰,如果用公鑰對數據進行加密,只有用對應的私鑰才能解密。

其實,公鑰就是公開的秘鑰,私鑰就是要你私自保存好的秘鑰。

非對稱加密算法需要有一對公私鑰~

❝假設你有一個文件,你用字母a加密,只有字母b才能解密;或者你用b加密,只有a才能解密,那么a和b就是一對公私鑰。如果密鑰a公開,密鑰b你就要私自保存好啦,這時候密鑰a就是公鑰,密鑰b就是私鑰。相反,如果b公開,a就要保存好,這時候呢,秘鑰b就是公鑰,秘鑰a就是私鑰。❞

加簽驗簽概念

「加簽」:用Hash函數把原始報文生成報文摘要,然后用私鑰對這個摘要進行加密,就得到這個報文對應的數字簽名。通常來說呢,請求方會把「數字簽名和報文原文」一并發送給接收方。

 

「驗簽」:接收方拿到原始報文和數字簽名后,用「同一個Hash函數」從報文中生成摘要A。另外,用對方提供的公鑰對數字簽名進行解密,得到摘要B,對比A和B是否相同,就可以得知報文有沒有被篡改過。

 

為什么需要加簽驗簽

上小節中,加簽和驗簽我們已經知道概念啦,那么,為什么需要加簽和驗簽呢?有些朋友可能覺得,我們不是用「公鑰加密,私鑰解密」就好了嘛?

接下來呢,舉個demo吧。

❝假設現在有A公司,要接入C公司的轉賬系統。在一開始呢,C公司把自己的公鑰寄給A公司,自己收藏好私鑰。A公司這邊的商戶,發起轉賬時,A公司先用C公司的公鑰,對請求報文加密,加密報文到達C公司的轉賬系統時,C公司就用自己的私鑰把報文揭開。假設在加密的報文在傳輸過程中,被中間人Actor獲取了,他也郁悶,因為他沒有私鑰,看著天鵝肉,又吃不了。本來想修改報文,給自己賬號轉一個億的,哈哈。這個實現方式看起來是天衣無縫,穩得一匹的。❞

 

但是呢,如果一開始,C公司把公鑰發給公司A的時候,就被中間人Actor獲取到呢,醬紫就出問題了。

❝中間人Actor截取了C的公鑰,他把自己的公鑰發給了A公司,A誤以為這就是C公司的公鑰。A在發起轉賬時,用Actor的公鑰,對請求報文加密,加密報文到在傳輸過程,Actor又截取了,這時候,他用自己的私鑰解密,然后修改了報文(給自己轉一個億),再用C的公鑰加密,發給C公司,C公司收到報文后,繼續用自己的私鑰解密。最后是不是A公司的轉賬賬戶損失了一個億呢~❞

 

C公司是怎么區分報文是不是來自A呢,還是被中間人修改過呢?為了表明身份和報文真實性,這就需要「加簽驗簽」啦!

❝A公司把自己的公鑰也發送給C公司,私鑰自己保留著。在發起轉賬時,先用自己的私鑰對請求報文加簽,于是得到自己的數字簽名。再把數字簽名和請求報文一起發送給C公司。C公司收到報文后,拿A的公鑰進行驗簽,如果原始報文和數字簽名的摘要內容不一致,那就是報文被篡改啦~❞

 

有些朋友可能有疑問,假設A在發自己的公鑰給C公司的時候,也被中間人Actor截取了呢。嗯嗯,我們來模擬一波Actor又截取了公鑰,看看Actor能干出什么事情來~哈哈

❝假設Actor截取到A的公鑰后,隨后也截取了到A發往C的報文。他截取到報文后,第一件想做的事肯定是修改報文內容。但是如果單單修改原始報文是不可以的,因為發過去C公司肯定驗簽不過啦。但是呢,數字簽名似乎解不開,因為消息摘要算法(hash算法)無法逆向解開的,只起驗證的作用呢....❞

所以呢,公鑰與私鑰是用來加密與加密的,「加簽與驗簽是用來證明身份」,以免被篡改的。

常見加密相關算法簡介

  • 消息摘要算法
  • 對稱加密算法
  • 非對稱加密算法
  • 國密算法

消息摘要算法:

  • 相同的明文數據經過相同的消息摘要算法會得到相同的密文結果值。
  • 數據經過消息摘要算法處理,得到的摘要結果值,是無法還原為處理前的數據的。
  • 數據摘要算法也被稱為哈希(Hash)算法或散列算法。
  • 消息摘要算法一般用于簽名驗簽。

消息摘要算法主要分三類:MD(Message Digest,消息摘要算法)、SHA(Secure Hash Algorithm,安全散列算法)和MAC(Message Authentication Code,消息認證碼算法)。

 

MD家族算法

MD(Message Digest,消息摘要算法)家族,包括MD2,MD4,MD5。

  • MD2,MD4,MD5 計算的結果都是是一個128位(即16字節)的散列值,用于確保信息傳輸完整一致。
  • MD2的算法較慢但相對安全,MD4速度很快,但安全性下降,MD5則比MD4更安全、速度更快。
  • MD5被廣泛應用于數據完整性校驗、數據(消息)摘要、數據加密等。
  • MD5,可以被破解,對于需要高度安全性的數據,專家一般建議改用其他算法,如SHA-2。2004年,證實MD5算法無法防止碰撞攻擊,因此不適用于安全性認證,如SSL公開密鑰認證或是數字簽名等用途。

舉個例子,看看如何獲取字符串的MD5值吧:

  1. public class MD5Test { 
  2.  
  3.     public static void main(String[] args) throws UnsupportedEncodingException { 
  4.         String s = "123"
  5.         byte[] result = getMD5Bytes(s.getBytes()); 
  6.         StringBuilder stringBuilder = new StringBuilder(); 
  7.         for (byte temp : result) { 
  8.             if (temp >= 0 && temp < 16) { 
  9.                 stringBuilder.append("0"); 
  10.             } 
  11.             stringBuilder.append(Integer.toHexString(temp & 0xff)); 
  12.         } 
  13.         System.out.println(s + ",MD5加密后:" + stringBuilder.toString()); 
  14.     } 
  15.  
  16.     private static byte[] getMD5Bytes(byte[] content) { 
  17.         try { 
  18.             MessageDigest md5 = MessageDigest.getInstance("MD5"); 
  19.             return md5.digest(content); 
  20.         } catch (NoSuchAlgorithmException e) { 
  21.             throw new RuntimeException(e); 
  22.         } 
  23.     } 

運行結果:

  1. 123,MD5加密后:202cb962ac59075b964b07152d234b70 

ShA家族算法

SHA(Secure Hash Algorithm,安全散列算法),包括SHA-0、SHA-1、SHA-2(SHA-256,SHA-512,SHA-224,SHA-384等)、SHA-3。它是在MD算法基礎上實現的,與MD算法區別在于「摘要長度」,SHA 算法的摘要「長度更長,安全性更高」。

❝SHA-0發布之后很快就被NSA撤回,因為含有會降低密碼安全性的錯誤,它是SHA-1的前身。

SHA-1在許多安全協議中廣為使用,包括TLS、GnuPG、SSH、S/MIME和IPsec,是MD5的后繼者。

SHA-2包括SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。它的算法跟SHA-1基本上相似,目前還沒有出現明顯弱點。

SHA-3是2015年正式發布,由于對「MD5出現成功的破解」,以及對SHA-0和SHA-1出現理論上破解的方法,SHA-3應運而生。它與之前算法不同的是,它是可替換的加密散列算法。❞

SHA-1、SHA-2(SHA-256,SHA-512,SHA-224,SHA-384)等算法是比較常用的,我們來看看跟MD5的對比吧

算法類型 摘要長度(bits) 最大輸入消息長度(bits) 碰撞攻擊(bits) 性能示例(MiB/s)
MD5 128 無限 ≤18(發現碰撞) 335
SHA-1 160 2^64 − 1 <63(發現碰撞) 192
SHA-224 224 2^64 − 1 112 139
SHA-256 256 2^64 − 1 128 139
SHA-384 384 2^128 − 1 192 154
SHA-512 512 2^128 − 1 256 154

MAC算法家族

MAC算法 MAC(Message Authentication Code,消息認證碼算法),是帶密鑰的Hash函數。輸入密鑰和消息,輸出一個消息摘要。它集合了MD和SHA兩大系列消息摘要算法。

MD 系列算法: HmacMD2、HmacMD4 和 HmacMD5 ;

SHA 系列算法:HmacSHA1、HmacSHA224、HmacSHA256、HmacSHA384 和 HmacSHA512 。

對稱加密算法

加密和解密使用「相同密鑰」的加密算法就是對稱加密算法。常見的對稱加密算法有AES、3DES、DES、RC5、RC6等。

 

DES

數據加密標準(英語:Data Encryption Standard,縮寫為 DES)是一種對稱密鑰加密塊密碼算法。DES算法的入口參數有三個:Key、Data、Mode。

Key: 7個字節共56位,是DES算法的工作密鑰;

Data: 8個字節64位,是要被加密或被解密的數據;

Mode: 加密或解密。

3DES

三重數據加密算法(英語:Triple Data Encryption Algorithm,又稱3DES(Triple DES),是一種對稱密鑰加密塊密碼,相當于是對每個數據塊應用三次數據加密標準(DES)算法。

AES

AES,高級加密標準(英語:Advanced Encryption Standard),在密碼學中又稱Rijndael加密法,是美國聯邦政府采用的一種區塊加密標準。

采用對稱分組密碼體制,密鑰長度為 128 位、 192 位、256 位,分組長度128位

相對于DES ,AES具有更好的 安全性、效率 和 靈活性。

非對稱加密算法

非對稱加密算法需要兩個密鑰:公鑰和私鑰。公鑰與私鑰是成對存在的,如果用公鑰對數據進行加密,只有用對應的私鑰才能解密。主要的非對稱加密算法有:RSA、Elgamal、DSA、D-H、ECC。

 

RSA算法

RSA加密算法是一種非對稱加密算法,廣泛應用于加密和數字簽名

RSA算法原理:兩個大素數的乘積進行因式分解卻極其困難,因此可以將乘積公開作為加密密鑰。

RSA是被研究得最廣泛的公鑰算法,從提出到現在,經歷了各種攻擊的考驗,普遍認為是目前最優秀的公鑰方案之一。

DSA

DSA(Digital Signature Algorithm,數字簽名算法),也是一種非對稱加密算法。

DSA和RSA區別在,DSA僅用于數字簽名,不能用于數據加密解密。其安全性和RSA相當,但其性能要比RSA好。

ECC 算法

ECC(Elliptic Curves Cryptography,橢圓曲線密碼編碼學),基于橢圓曲線加密。

Ecc主要優勢是,在某些情況下,它比其他的方法使用更小的密鑰,比如RSA加密算法,提供相當的或更高等級的安全級別。

它的一個缺點是,加密和解密操作的實現比其他機制時間長 (相比RSA算法,該算法對CPU 消耗嚴重)。

國密算法

國密即國家密碼局認定的國產密碼算法。為了保障商用密碼的安全性,國家商用密碼管理辦公室制定了一系列密碼標準,即SM1,SM2,SM3,SM4等國密算法。

 

SM1

  • SM1,為對稱加密算法,加密強度為128位,基于硬件實現。
  • SM1的加密強度和性能,與AES相當。

SM2

  • SM2主要包括三部分:簽名算法、密鑰交換算法、加密算法
  • SM2用于替換RSA加密算法,基于ECC,效率較低。

SM3

  • SM3,即國產消息摘要算法。
  • 適用于商用密碼應用中的數字簽名和驗證,消息認證碼的生成與驗證以及隨機數的生成。

SM4

  • SM4是一個分組算法,用于無線局域網產品。
  • 該算法的分組長度為128比特,密鑰長度為128比特。
  • 加密算法與密鑰擴展算法都采用32輪非線性迭代結構。
  • 解密算法與加密算法的結構相同,只是輪密鑰的使用順序相反,解密輪密鑰是加密輪密鑰的逆序。
  • 它的功能類似國際算法的DES。

加簽驗簽相關Java的API

這個小節先介紹一下加簽驗簽需要用到的API吧~

 

加簽相關API

  1. - java.security.Signature.getInstance(String algorithm); //根據對應算法,初始化簽名對象 
  2. - KeyFactory.getInstance(String algorithm);// 根據對應算法,生成KeyFactory對象 
  3. - KeyFactory.generatePrivate(KeySpec keySpec); //生成私鑰 
  4. - java.security.Signature.initSign(PrivateKey privateKey) //由私鑰,初始化加簽對象 
  5. - java.security.Signature.update(byte[] data)  //把原始報文更新到加簽對象 
  6. - java.security.Signature.sign();//加簽 

「Signature.getInstance(String algorithm);」

  • 根據對應算法,初始化簽名對象
  • algorithm參數可以取SHA256WithRSA或者MD5WithRSA等參數,SHA256WithRSA表示生成摘要用的是SHA256算法,簽名加簽用的是RSA算法

「KeyFactory.getInstance(String algorithm);」

  • 根據對應算法,生成KeyFactory對象,比如你的公私鑰用的是RSA算法,那么就傳入RSA

「KeyFactory.generatePrivate(KeySpec keySpec)」

  • 生成私鑰,加簽用的是私鑰哈,所以需要通過KeyFactory先構造一個私鑰對象。

「Signature.initSign(PrivateKey privateKey)」

  • 加簽用的是私鑰,所以傳入私鑰,初始化加簽對象

「Signature.update(byte[] data)」

  • 把原始報文更新到加簽對象

「java.security.Signature.sign();」

  • 進行加簽操作

驗簽相關API

  1. - java.security.Signature.getInstance(String algorithm); //根據對應算法,初始化簽名對象 
  2. - KeyFactory.getInstance(String algorithm);// 根據對應算法,生成KeyFactory對象 
  3. - KeyFactory.generatePublic(KeySpec keySpec); //生成公鑰 
  4. - java.security.Signature.initVerify(publicKey); //由公鑰,初始化驗簽對象 
  5. - java.security.Signature.update(byte[] data)  //把原始報文更新到驗簽對象 
  6. - java.security.Signature.verify(byte[] signature);//驗簽 

「Signature.getInstance(String algorithm)」

  • 根據對應算法,初始化簽名對象,注意驗簽和加簽是需要用相同的algorithm算法參數哦~

「KeyFactory.getInstance(String algorithm);」

  • 根據對應算法,生成KeyFactory對象

「KeyFactory.generatePublic(KeySpec keySpec);」

  • 生成公鑰,驗簽用的是公鑰,通過KeyFactory先構造一個公鑰對象

「Signature.initVerify(publicKey);」

  • 公鑰驗簽,所以傳入公鑰對象參數,初始化驗簽對象

「Signature.update(byte[] data)」

  • 把原始報文更新到加簽對象

「Signature.verify(byte[] signature);」

  • 進行驗簽操作

加簽驗簽代碼實現前幾個小節討論完概念,是時候上代碼實戰了,我這邊用的是SHA-256作為摘要算法,RSA作為簽名驗簽算法,如下:

  1. package pattern; 
  2.  
  3. import sun.misc.BASE64Decoder; 
  4. import sun.misc.BASE64Encoder; 
  5.  
  6. import java.io.IOException; 
  7. import java.io.UnsupportedEncodingException; 
  8. import java.security.*; 
  9. import java.security.spec.InvalidKeySpecException; 
  10. import java.security.spec.PKCS8EncodedKeySpec; 
  11.  
  12. /** 
  13.  * 加簽驗簽demo 
  14.  *  @Author 撿田螺的小男孩 
  15.  */ 
  16. public class SignatureTest { 
  17.     //公鑰字符串 
  18.     private static final String PUBLIC_KEY_STR = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDaJzVjC5K6kbS2YE2fiDs6H8pB\n" + 
  19.             "JFDGEYqqJJC9I3E0Ebr5FsofdImV5eWdBSeADwcR9ppNbpORdZmcX6SipogKx9PX\n" + 
  20.             "5aAO4GPesroVeOs91xrLEGt/arteW8iSD+ZaGDUVV3+wcEdci/eCvFlc5PUuZJou\n" + 
  21.             "M2XZaDK4Fg2IRTfDXQIDAQAB"
  22.     //私鑰字符串 
  23.     private static final String PRIVATE_KEY_STR = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBANonNWMLkrqRtLZg\n" + 
  24.             "TZ+IOzofykEkUMYRiqokkL0jcTQRuvkWyh90iZXl5Z0FJ4APBxH2mk1uk5F1mZxf\n" + 
  25.             "pKKmiArH09floA7gY96yuhV46z3XGssQa39qu15byJIP5loYNRVXf7BwR1yL94K8\n" + 
  26.             "WVzk9S5kmi4zZdloMrgWDYhFN8NdAgMBAAECgYA9bz1Bn0i68b2KfqRdgOfs/nbe\n" + 
  27.             "0XNN1DLQp2t7WDfRCg01iI1zPkZgyFVZWtI85f5/uIrLs5ArLosL1oNuqqc0nNne\n" + 
  28.             "CvJK+ZxvA98Hx3ZqYTzDnleR054YhofL5awbhSciYVic204DOG1rhSsYWMqtX7J7\n" + 
  29.             "3geoWL7TYdMfYXcCAQJBAPMMKsz6ZJh98EeQ1tDG5gpAGWFQkYNrxZDelP/LjeO0\n" + 
  30.             "TP3XkQnIpcaZoCs7V/rRGRGMWwQ2BUdc/01in89ZZ5ECQQDlx2oBc1CtOAm2UAhN\n" + 
  31.             "1xWrPkZWENQ53wTrwXO4qbTGDfBKon0AehLlGCSqxQ71aufLkNO7ZlX0IHTAlnk1\n" + 
  32.             "TvENAkAGSEQ69CXxgx/Y2beTwfBkR2/gghKg0QJUUkyLqBlMz3ZGAXJwTE1sqr/n\n" + 
  33.             "HiuSAiGhwH0ByNuuEotO1sPGukrhAkAMK26a2w+nzPL+u+hkrwKPykGRZ1zGH+Cz\n" + 
  34.             "19AYNKzFXJGgclCqiMydY5T1knBDYUEbj/UW1Mmyn1FvrciHoUG1AkAEMEIuDauz\n" + 
  35.             "JabEAU08YmZw6OoDGsukRWaPfjOEiVhH88p00veM1R37nwhoDMGyEGXVeVzNPvk7\n" + 
  36.             "cELg28MSRzCK"
  37.  
  38.  
  39.     public static void main(String[] args) throws SignatureException, NoSuchAlgorithmException, InvalidKeyException, IOException, InvalidKeySpecException { 
  40.         //原始報文 
  41.         String plain = "歡迎大家關注我的公眾號,撿田螺的小男孩"
  42.         //加簽 
  43.         byte[] signatureByte = sign(plain); 
  44.         System.out.println("原始報文是:" + plain); 
  45.         System.out.println("加簽結果:"); 
  46.         System.out.println(new BASE64Encoder().encode(signatureByte)); 
  47.         //驗簽 
  48.         boolean verifyResult = verify(plain, signatureByte); 
  49.         System.out.println("驗簽結果:" + verifyResult); 
  50.     } 
  51.  
  52.     /** 
  53.      * 加簽方法 
  54.      * @param plain 
  55.      * @return 
  56.      * @throws NoSuchAlgorithmException 
  57.      * @throws InvalidKeyException 
  58.      * @throws UnsupportedEncodingException 
  59.      * @throws SignatureException 
  60.      */ 
  61.     private static byte[] sign(String plain) throws NoSuchAlgorithmException, InvalidKeyException, UnsupportedEncodingException, SignatureException { 
  62.         //根據對應算法,獲取簽名對象實例 
  63.         Signature signature = Signature.getInstance("SHA256WithRSA"); 
  64.         //獲取私鑰,加簽用的是私鑰,私鑰一般是在配置文件里面讀的,這里為了演示方便,根據私鑰字符串生成私鑰對象 
  65.         PrivateKey privateKey = getPriveteKey(PRIVATE_KEY_STR); 
  66.         //初始化簽名對象 
  67.         signature.initSign(privateKey); 
  68.         //把原始報文更新到對象 
  69.         signature.update(plain.getBytes("UTF-8")); 
  70.         //加簽 
  71.         return signature.sign(); 
  72.     } 
  73.  
  74.     /** 
  75.      * 驗簽方法 
  76.      * @param plain 
  77.      * @param signatureByte 
  78.      * @return 
  79.      * @throws NoSuchAlgorithmException 
  80.      * @throws InvalidKeyException 
  81.      * @throws IOException 
  82.      * @throws SignatureException 
  83.      * @throws InvalidKeySpecException 
  84.      */ 
  85.     private static boolean verify(String plain, byte[] signatureByte) throws NoSuchAlgorithmException, InvalidKeyException, IOException, SignatureException, InvalidKeySpecException { 
  86.         //獲取公鑰 
  87.         PublicKey publicKey = getPublicKey(PUBLIC_KEY_STR); 
  88.         //根據對應算法,獲取簽名對象實例 
  89.         Signature signature = Signature.getInstance("SHA256WithRSA"); 
  90.         //初始化簽名對象 
  91.         signature.initVerify(publicKey); 
  92.         //把原始報文更新到簽名對象 
  93.         signature.update(plain.getBytes("UTF-8")); 
  94.         //進行驗簽 
  95.         return signature.verify(signatureByte); 
  96.     } 
  97.  
  98.     private static PublicKey getPublicKey(String publicKeyStr) throws InvalidKeySpecException, IOException { 
  99.         PublicKey publicKey = null
  100.         try { 
  101.             java.security.spec.X509EncodedKeySpec bobPubKeySpec = new java.security.spec.X509EncodedKeySpec( 
  102.                     new BASE64Decoder().decodeBuffer(publicKeyStr)); 
  103.             // RSA對稱加密算法 
  104.             java.security.KeyFactory keyFactory; 
  105.             keyFactory = java.security.KeyFactory.getInstance("RSA"); 
  106.             // 生成公鑰對象 
  107.             publicKey = keyFactory.generatePublic(bobPubKeySpec); 
  108.            } catch (NoSuchAlgorithmException e) { 
  109.              e.printStackTrace(); 
  110.             } 
  111.         return publicKey; 
  112.       } 
  113.  
  114.     private static PrivateKey getPriveteKey(String privateKeyStr) { 
  115.         PrivateKey privateKey = null
  116.         PKCS8EncodedKeySpec priPKCS8; 
  117.         try { 
  118.             priPKCS8 = new PKCS8EncodedKeySpec(new BASE64Decoder().decodeBuffer(privateKeyStr)); 
  119.             KeyFactory keyf = KeyFactory.getInstance("RSA"); 
  120.             privateKey = keyf.generatePrivate(priPKCS8); 
  121.         } catch (IOException | NoSuchAlgorithmException | InvalidKeySpecException e) { 
  122.             e.printStackTrace(); 
  123.         } 
  124.         return privateKey; 
  125.     } 

「運行結果:」

  1. 原始報文是:歡迎大家關注我的公眾號,撿田螺的小男孩 
  2. 加簽結果: 
  3. Oz15/aybGe42eGHbc+iMoSYHSCc8tfRskTVjjGSTPD4HjadL0CC5JUWNUW0WxHjUb4MvxWo2oeWE 
  4. Qw0+m61d+JgBMto/TWcVDcgwL/AbObsbWdQ6E/fVRqG13clkE8MyKsjt9Z7tcbwpycYTv0rUR4co 
  5. rndAVfBdtv5KeV+OXqM= 
  6. 驗簽結果:true 

本文轉載自微信公眾號「 撿田螺的小男孩」,可以通過以下二維碼關注。轉載本文請聯系 撿田螺的小男孩公眾號。

 

責任編輯:武曉燕 來源: 撿田螺的小男孩
相關推薦

2023-03-10 18:34:31

2024-01-01 09:08:52

API簽名驗簽

2020-05-06 15:59:07

JavaScript程序員技術

2020-01-12 19:10:30

Java程序員數據

2020-05-09 11:20:02

Java結構圖虛擬機

2021-12-27 16:20:45

鴻蒙HarmonyOS應用

2009-06-25 09:33:43

Java API程序員

2021-12-07 00:10:25

C# 微信支付

2020-04-20 19:00:30

程序員分布式事務架構

2014-08-15 14:25:48

Android程序員資源

2014-08-20 10:28:29

Android

2011-06-11 20:59:12

程序員

2019-09-25 11:39:07

程序員編程技術

2022-10-24 09:00:47

畫圖工具程序員XMind

2020-03-16 08:22:11

Java程序員虛擬機

2021-05-06 07:04:35

安全漏洞業務

2021-03-02 09:34:15

GitHub倉庫代碼

2015-10-29 09:50:36

程序員免費編程圖書

2019-04-23 13:51:43

程序員技能開發者

2015-07-09 10:30:35

程序員必備經驗
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 九九热这里 | 久久国产亚洲 | 亚州无限乱码 | 亚洲色图综合网 | 久久精品日 | av官网在线 | 欧美日韩精品久久久免费观看 | 欧美激情精品久久久久久变态 | 热re99久久精品国99热观看 | 91高清视频在线 | 亚洲 中文 欧美 日韩 在线观看 | 日韩伦理一区二区 | 国产免费拔擦拔擦8x高清 | 天堂色综合| 91久久精品国产 | 色毛片 | 久久久久久网 | 天天玩夜夜操 | 欧美一区二区在线观看视频 | 精品国产欧美日韩不卡在线观看 | 亚洲91 | 黄色成人国产 | 欧一区二区 | 久久久精品影院 | 一区二区三区成人 | 欧美成人一区二区三区 | 久久里面有精品 | 日韩欧美国产一区二区 | 91精品国产综合久久久久久蜜臀 | 影音先锋男| 天天插天天操 | 精品1区2区 | 中文字幕久久久 | 成人午夜在线 | 美女福利视频网站 | 久久av一区二区三区 | 亚洲成人综合网站 | 免费看的黄网站 | 国产精品久久久久久久久久久久久久 | www.男人天堂.com | 亚洲精品二区 |