久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長(zhǎng)資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      HTTPS心得之基礎(chǔ)密碼學(xué)知識(shí)和Python PyCrypto庫(kù)的介紹使用

            在更詳細(xì)的學(xué)習(xí)HTTPS之前,我也覺得很有必要學(xué)習(xí)下HTTPS經(jīng)常用到的加密編碼技術(shù)的背景知識(shí)。密碼學(xué)是對(duì)報(bào)文進(jìn)行編解碼的機(jī)制和技巧。可以用來加密數(shù)據(jù),比如數(shù)據(jù)加密常用的AES/ECB/PKCS5Padding加密,也可以用來防止報(bào)文的篡改,使用RSA2048withSHA256簽名驗(yàn)證,使用MD5簽名等。如果這些不清楚,即使學(xué)習(xí)簡(jiǎn)單能做一個(gè)HTTPS的服務(wù)器和客戶端,實(shí)際項(xiàng)目上遇見這類問題還是束手無策,下面介紹下數(shù)字加密的一些常用的術(shù)語(yǔ)。

            一、密碼學(xué)基礎(chǔ)概念

            1、密碼 : 對(duì)文本進(jìn)行編碼,使偷窺者無法識(shí)別的算法。是一套編碼方案,一種特殊的報(bào)文編碼和相應(yīng)的解碼方式的結(jié)合體。

                 加密之前的原始報(bào)文稱為明文,使用密碼之后的報(bào)文叫密文。一個(gè)簡(jiǎn)單的例子:

                        HTTPS心得之基礎(chǔ)密碼學(xué)知識(shí)和Python PyCrypto庫(kù)的介紹使用

       

                  這個(gè)例子是著名的三字符循環(huán)移位密碼rot3,在字母中循環(huán)移位3個(gè)字符。

                             HTTPS心得之基礎(chǔ)密碼學(xué)知識(shí)和Python PyCrypto庫(kù)的介紹使用 

            2、密鑰 : 改變密碼行為的數(shù)字化參數(shù)。

                rot3這種密碼是比較簡(jiǎn)單的算法,用筆和紙都能解碼出來,十分的不安全,于是出現(xiàn)了密鑰。比如rot3算法轉(zhuǎn)換使用密鑰的算法就是“循環(huán)移位N字符”密碼。N就是密鑰,N值不通,即使是同一個(gè)算法,編碼                   出來的報(bào)文也是不一樣的。

                       HTTPS心得之基礎(chǔ)密碼學(xué)知識(shí)和Python PyCrypto庫(kù)的介紹使用

           3、 數(shù)字密碼:一段明文P,一個(gè)編碼函數(shù)E,一個(gè)數(shù)字密鑰e,經(jīng)過密碼E,能產(chǎn)生密文C。密文C通過解密函數(shù)D和解密密鑰d,可以將明文P解碼出來

                 HTTPS心得之基礎(chǔ)密碼學(xué)知識(shí)和Python PyCrypto庫(kù)的介紹使用

                             

                    對(duì)稱密鑰加密系統(tǒng):編碼和解碼使用相同密鑰的算法。e=d。

                    在對(duì)稱密鑰加密技術(shù)中,發(fā)送端和接收端共享相同的密鑰進(jìn)行通信。比較流行的對(duì)稱加密算法包括:DES,RC4,RC2。密鑰值的數(shù)量取決于密鑰的位數(shù)。比如使用使用8位的密鑰就可能有256個(gè)可能的密鑰                  值,如果一個(gè)算法使用8位的密鑰,那這個(gè)加密算法是很容易被破解的,對(duì)于對(duì)稱密鑰的加密技術(shù),128位的密鑰被認(rèn)為是非常強(qiáng)大的了。需要10的19次方年才能破解(之前貌似有新聞?wù)f已破解,未仔細(xì)究)。

             HTTPS心得之基礎(chǔ)密碼學(xué)知識(shí)和Python PyCrypto庫(kù)的介紹使用

                          使用對(duì)稱密鑰有一個(gè)缺點(diǎn):發(fā)送方和接收方在相互對(duì)話前,需要建立一個(gè)共享的保密的密鑰值。比如服務(wù)器X跟客戶端A交互,服務(wù)器X需要保存XA密鑰在服務(wù)器,與客戶端B交互,需要保存XB密鑰。每一對(duì)              通信實(shí)體都需要自己的私鑰。如果有N個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)都要和其他的N-1節(jié)點(diǎn)進(jìn)行通話,那對(duì)管理密鑰,簡(jiǎn)直是異常噩夢(mèng)。

                                   HTTPS心得之基礎(chǔ)密碼學(xué)知識(shí)和Python PyCrypto庫(kù)的介紹使用

       

       

            4、非對(duì)稱密鑰加密系統(tǒng): 編碼和解碼使用不同密鑰的算法。

                   使用對(duì)稱密鑰的密碼,密鑰都是非公開的,只有這一對(duì)通話實(shí)體才知道彼此選擇的密鑰,但是對(duì)于非對(duì)稱密鑰,給所有的客戶端的密鑰都是一樣的,是公開的。而解碼的密鑰是私有的,只有服務(wù)器知道,只有服       務(wù)器端才能解密。這樣服務(wù)器X只需要將其ex密鑰公布于眾,任何人想要給X發(fā)信息,使用同一個(gè)密鑰即可。但是只有服務(wù)器X使用私有密鑰才能正確的解密報(bào)文。比較流行的有RSA。

                                 HTTPS心得之基礎(chǔ)密碼學(xué)知識(shí)和Python PyCrypto庫(kù)的介紹使用

           5、 數(shù)字簽名:用來延期報(bào)文未被偽造篡改的校驗(yàn)和。私鑰簽名,公鑰驗(yàn)簽。

                        數(shù)字簽名通常是用非對(duì)稱公開密鑰技術(shù)產(chǎn)生的。以節(jié)點(diǎn)A給節(jié)點(diǎn)B發(fā)送報(bào)文,附加簽名為例:

                  A、節(jié)點(diǎn)A從報(bào)文中選取定長(zhǎng)的數(shù)據(jù),在定長(zhǎng)的摘要。

                  B、節(jié)點(diǎn)A對(duì)摘要應(yīng)用了一個(gè)“簽名”函數(shù),這個(gè)函數(shù)將用戶的私鑰密鑰做為參數(shù),只有節(jié)點(diǎn)A才知道這個(gè)私鑰。

                  C、一旦計(jì)算出簽名,節(jié)點(diǎn)A就將其附加在報(bào)文的末尾,將報(bào)文和簽名發(fā)送給B。

                  D、B接收到報(bào)文后,需要確定報(bào)文確實(shí)是節(jié)點(diǎn)A發(fā)送過來的且沒有篡改,使用公開的密鑰的反函數(shù)。拆包后的摘要與A不一致,則說明報(bào)文在傳輸過程中被篡改了。

                           HTTPS心得之基礎(chǔ)密碼學(xué)知識(shí)和Python PyCrypto庫(kù)的介紹使用

       

             六、數(shù)字證書:由一個(gè)可信的組織驗(yàn)證和簽發(fā)的識(shí)別信息。一般用于證明服務(wù)器是可信任的服務(wù)器。跟數(shù)字簽名完全不是一個(gè)概念。

                    數(shù)字證書中包含了由某個(gè)受信任組織擔(dān)保的用戶或者公司的相關(guān)信息。比如我們的身份證和護(hù)照,是由政府這個(gè)權(quán)威機(jī)構(gòu)在特殊的紙上簽發(fā)且蓋章登記的,很難偽造,可信度很高。數(shù)字證書的所有信息都是由一個(gè)官方的“證書頒發(fā)機(jī)構(gòu)”以數(shù)字方式簽發(fā)的,一般包含以下內(nèi)容:

            HTTPS心得之基礎(chǔ)密碼學(xué)知識(shí)和Python PyCrypto庫(kù)的介紹使用

                 任何人都可以創(chuàng)建一個(gè)數(shù)字證書,但并不是所有人都能獲取受人尊敬的簽發(fā)權(quán),證書頒發(fā)機(jī)構(gòu)CA常見的有谷歌等,一般情況下,獲取一個(gè)權(quán)威機(jī)構(gòu)簽發(fā)的證書的費(fèi)用是相當(dāng)昂貴的,所以可以使用某類工具(openssl),自己注冊(cè)CA組織,創(chuàng)建數(shù)字證書?,F(xiàn)在大部分的證書都以X.509 V3作為一準(zhǔn)標(biāo)準(zhǔn)格式,將證書信息規(guī)范到一些可解析的字段信息中,大致如下所示。

                                  HTTPS心得之基礎(chǔ)密碼學(xué)知識(shí)和Python PyCrypto庫(kù)的介紹使用

                                   HTTPS心得之基礎(chǔ)密碼學(xué)知識(shí)和Python PyCrypto庫(kù)的介紹使用

                HTTPS協(xié)議建立一個(gè)安全的事務(wù)后,現(xiàn)在的瀏覽器會(huì)子的那個(gè)的獲取所連接服務(wù)器的數(shù)字證書。如果服務(wù)器端沒有證書,安全連接就會(huì)失?。ǖ强蛻舳丝梢栽O(shè)置是否要校驗(yàn)證書的合法性)。瀏覽器在收到證書后需要對(duì)簽名頒發(fā)機(jī)構(gòu)進(jìn)行檢查。

                如果這個(gè)機(jī)構(gòu)是很有名的權(quán)威公共簽名機(jī)構(gòu),瀏覽器可能早已知道其公鑰,接下來瀏覽器就需要驗(yàn)證簽名的正確性,使用公鑰和解密方法,拆包獲取摘要信息,如果摘要信息與證書中的摘要信息一致,則證書的完整性得到了確定。

               如果瀏覽器對(duì)機(jī)構(gòu)一無所知,瀏覽器無法確定是否需要信任這個(gè)組織的簽名頒發(fā)的證書,通常瀏覽器會(huì)向用戶顯示一個(gè)對(duì)話框,讓用戶自行選擇是否信任。

                HTTPS心得之基礎(chǔ)密碼學(xué)知識(shí)和Python PyCrypto庫(kù)的介紹使用

       

                   二、Python的密碼學(xué)模塊pycrypto的簡(jiǎn)單學(xué)習(xí)。

            1、pycryto 庫(kù)簡(jiǎn)介:

                   官網(wǎng)的手冊(cè)的鏈接:http://pythonhosted.org/pycrypto/

                   pycryto模塊不是Python的內(nèi)置模塊,pycrypto模塊是一個(gè)實(shí)現(xiàn)了各種算法和協(xié)議的加密模塊的結(jié)合,提供了各種加密方式對(duì)應(yīng)的多種加密算法的實(shí)現(xiàn),包括 單向加密、對(duì)稱加密以及公鑰加密和隨機(jī)數(shù)操作。hashlib和hmac雖然是Python的內(nèi)置模塊,但是它們只提供了單向加密相關(guān)算法的實(shí)現(xiàn),如果要使用對(duì)稱加密算法(如, DES,AES等)或者公鑰加密算法我們通常都是使用pycryto這個(gè)第三方模塊來實(shí)現(xiàn)。存在以下幾個(gè)子包:

                  HTTPS心得之基礎(chǔ)密碼學(xué)知識(shí)和Python PyCrypto庫(kù)的介紹使用

                 pycryto能實(shí)現(xiàn)大致3種類型的數(shù)據(jù)加密(單向加密、對(duì)稱加密 和非對(duì)稱加密),產(chǎn)生隨機(jī)數(shù),生成密鑰對(duì),數(shù)字簽名。

                A、單向加密,Crypto.Hash其中中包含MD5、SHA1、SHA256等,這些算法又稱為“哈希算法”或“散列算法”或“數(shù)據(jù)摘要算法”。Python內(nèi)置的hashlib和hmac也可以實(shí)現(xiàn)。

                B、對(duì)稱加密,Crypto.Cipher,如常見的DES等。

                C、非對(duì)稱加密,Crypto.Cipher ,如常見的AES加密等。

                D、隨機(jī)數(shù)操作,Crypto.Random,也可以使用Python內(nèi)置的random模塊和secrets模塊產(chǎn)生。

                E、生成密鑰對(duì),Crypto.PublicKey,支持生成RSA算法的密鑰對(duì)生成。

                F、數(shù)字簽名與驗(yàn)簽,可能需要使用到Crypto.PublicKey,Crypto.Hash,Crypto.Signature。

           2、安裝

                pycryto不是Python的內(nèi)置模塊,所以在使用它之前需要通過Python模塊管理工具(如pip)來安裝,通過使用命令安裝:pip install pycryto。pycrypto模塊是用C語(yǔ)言實(shí)現(xiàn)的,Python模塊管理工具在安裝它時(shí)需要使用C/C++編譯工具對(duì)它的代碼進(jìn)行編譯。這一點(diǎn)需要注意下,可能安裝的時(shí)候會(huì)報(bào)錯(cuò)。

           3、實(shí)例

          A.  使用SHA256算法獲取一段數(shù)據(jù)的摘要信息

      from Crypto.Hash import SHA256

      hash = SHA256.new()
      hash.update(‘Hello, World!’)
      digest = hash.hexdigest()
      print(digest)

        B、AES/ECB/PKCS5Padding加密。

              這是AES加密一般需要知道的格式,ECB是AES支持的模式,PKCS5Padding是填充方法。如果對(duì)AES算法不清楚,肯定就不明白模式,填充是什么意思,建議可以看下https://www.cnblogs.com/OneFri/p/5924605.html 這篇博客,在了解大致算法原理后,才能充分學(xué)習(xí)這個(gè)庫(kù)。

       

      from Crypto.Cipher import AES

      # 加密與解密所使用的密鑰,長(zhǎng)度必須是16的倍數(shù)
      AESkey = ‘PLKQ017MD5AESKEY’
      # 要加密的明文數(shù)據(jù),長(zhǎng)度必須是16的倍數(shù),可能不足,就需要填充
      plain_data = “Hello, World!”

      def encrypt(self,obj,data):
          bs = AES.block_size
          pad = lambda s: s + (bs – len(s) % bs) * chr(bs – len(s) % bs)
          encrypt_msg = obj.encrypt(pad(data))
          return  b2a_hex(encrypt_msg)

      # 數(shù)據(jù)加密
      obj = AES.new(AESkey, AES.MODE_ECB)
      cipher_data = obj .encrypt(obj,plain_data)
      print(‘cipher data:’, cipher_data)

       

          C、使用RSA算法生成密鑰對(duì)

       

      from Crypto import Random
      from Crypto.PublicKey import RSA

      # 獲取一個(gè)偽隨機(jī)數(shù)生成器
      random_generator = Random.new().read
      # 獲取一個(gè)rsa算法對(duì)應(yīng)的密鑰對(duì)生成器實(shí)例
      rsa = RSA.generate(1024, random_generator)

      # 生成私鑰并保存
      private_pem = rsa.exportKey()
      with open(‘rsa.key’, ‘w’) as f:
          f.write(private_pem)

      # 生成公鑰并保存
      public_pem = rsa.publickey().exportKey()
      with open(‘rsa.pub’, ‘w’) as f:
          f.write(public_pem)

       

      私鑰:

       

      —–BEGIN RSA PRIVATE KEY—–
      MIICXAIBAAKBgQCo7vV5xSzEdQeFq9n5MIWgIuLTBHuutZlFv+Ed8fIk3yC4So/d
      y1f64iuYFcDeNU7eVGqTSkHmAl4AihDXoaH6hxohrcX0bCg0j+VoQMe2zID7MzcE
      d50FhJbuG6JsWtYzLUYs7/cQ3urZYwB4PEVa0WxQj2aXUMsxp6vl1CgB4QIDAQAB
      AoGAS/I5y4e4S43tVsvej6efu1FTtdhDHlUn1fKgawz1dlwVYqSqruSW5gQ94v6M
      mZlPnqZGz3bHz3bq+cUYM0jH/5Tygz4a+dosziRCUbjMsFePbJ4nvGC/1hwQweCm
      +7sxog4sw91FrOfAg/iCcoeho0DghDolH9+zzwRYPIWUyUECQQDFGe+qccGwL9cU
      v+GmZxtF8GkRL7YrXI7cvnZhnZZ7TANjxlYukLGEpiFGIDd0Aky1QhkK18L8DTO4
      +iGXTpgJAkEA22o03/1IqeRBofbkkDmndArHNUnmv5pyVFaLKPoVgA4A1YsvqxUL
      DK6RwFGONUMknBWY59EDKCUdIf3CsVIhGQJAJKDMRB19xBMv4iBCe9z/WYDy1YnL
      TcWWmvkeIMfbVjBrFNif3WlwQ9lnp5OHGpzuymRtKPGtv49ohECfi3HEmQJAPI+n
      AoAdk07+Up8b3TccoinrbCj2uMH/dongpTHJx2uWDVr6kEUhpKF2d1fLYaYjr7VC
      XBHTxjvgO6aYG2to2QJBAIzDugOSTeQFpidCoewfa0XX4guF+WRf8wzyBC/XE6TY
      3cIY05sjbpfiVwW/Cb8Z2ia8EgBTGN8HSIFOUQ2jRl4=
      —–END RSA PRIVATE KEY—–

       

      公鑰:

      —–BEGIN PUBLIC KEY—–
      MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCo7vV5xSzEdQeFq9n5MIWgIuLT
      BHuutZlFv+Ed8fIk3yC4So/dy1f64iuYFcDeNU7eVGqTSkHmAl4AihDXoaH6hxoh
      rcX0bCg0j+VoQMe2zID7MzcEd50FhJbuG6JsWtYzLUYs7/cQ3urZYwB4PEVa0WxQ
      j2aXUMsxp6vl1CgB4QIDAQAB
      —–END PUBLIC KEY—–

              D、RSA2048withSHA256。數(shù)據(jù)先做SHA256摘要,再做RSA簽名。具體簽名的一些基礎(chǔ)理論知識(shí)可以參考這章節(jié)簽名的筆記。

       

      #!/usr/bin/env python2.7
      #coding:utf-8

      import cgi, base64
      from Crypto.PublicKey import RSA
      from Crypto.Signature import PKCS1_v1_5
      from Crypto.Hash import SHA256
      import base64
      import hashlib

      #私鑰文件
      priKey = ”’—–BEGIN RSA PRIVATE KEY—–
      MIICXQIBAAKBgQDKoeRzRVf8WoRSDYYqUzThpYCr90jfdFwTSXHJ526K8C6TEwdT
      UA+CFPQPRUg9jrYgFcown+J2myzO8BRLynD+XHb9ilLb49Mqk2CvDt/yK32lgHv3
      QVx14Dpb6h8isjncSF965fxBxlHGbvPwnHkJ9etRIYdYV3QpYohFszH3wQIDAQAB
      AoGAFhKqkw/ztK6biWClw8iKkyX3LURjsMu5F/TBK3BFb2cYe7bv7lhjSBVGPL+c
      TfBU0IvvGXrhLXBb4jLu0w67Xhggwwfc86vlZ8eLcrmYVat7N6amiBmYsw20GViU
      UFmePbo1G2BXqMA43JxqbIQwOLZ03zdw6GHj6EVlx369IAECQQD4K2R3K8ah50Yz
      LhF7zbYPIPGbHw+crP13THiYIYkHKJWsQDr8SXoNQ96TQsInTXUAmF2gzs/AwdQg
      gjIJ/dmBAkEA0QarqdWXZYbse1XIrQgBYTdVH9fNyLs1e1sBmNxlo4QMm/Le5a5L
      XenorEjnpjw5YpEJFDS4ijUI3dSzylC+QQJARqcD6TGbUUioobWB4L9GD7SPVFxZ
      c3+EgcxRoO4bNuCFDA8VO/InP1ONMFuXLt1MbCj0ru1yFCyamc63NEUDAQJBALt7
      PjGgsKCRuj6NnOcGDSbDWIitKZhnwfqYkAApfsiBQkYGO0LLaDIeAWG2KoCB9/6e
      lAQZnYPpOcCubWyDq4ECQQCrRDf0gVjPtipnPPS/sGN8m1Ds4znDDChhRlw74MI5
      FydvHFumChPe1Dj2I/BWeG1gA4ymXV1tE9phskV3XZfq
      —–END RSA PRIVATE KEY—–”’

      #公鑰文件
      pubKey = ”’—–BEGIN PUBLIC KEY—–
      MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDKoeRzRVf8WoRSDYYqUzThpYCr
      90jfdFwTSXHJ526K8C6TEwdTUA+CFPQPRUg9jrYgFcown+J2myzO8BRLynD+XHb9
      ilLb49Mqk2CvDt/yK32lgHv3QVx14Dpb6h8isjncSF965fxBxlHGbvPwnHkJ9etR
      IYdYV3QpYohFszH3wQIDAQAB
      —–END PUBLIC KEY—–”’

      def sign(data):
          key = RSA.importKey(priKey)
          h = SHA256.new(data)
          signer = PKCS1_v1_5.new(key)
          signature = signer.sign(h)
          return base64.b64encode(signature)

      raw_data =’test1′
      sign_data = sign(raw_data)
      print “sign_data: “, sign_data

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)