日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python之数据加密与解密(hashlib、hmac、random、base64、pycrypto)--转载

發布時間:2023/11/29 python 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python之数据加密与解密(hashlib、hmac、random、base64、pycrypto)--转载 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文內容


  • 數據加密概述
  • Python中實現數據加密的模塊簡介
  • hashlib與hmac模塊介紹
  • random與secrets模塊介紹
  • base64模塊介紹
  • pycrypto模塊介紹
  • 總結
  • 參考文檔
  • 提示: Python 2.7中的str是字節串,而Python 3.x中的str是字符串。本文中的代碼都是通過Python 2.7實現的,如果你使用的是Python 3.x,由于下面大部分加密與解密函數的參數都要求是字節對象,因此在調用下面介紹的加解密函數時,可能需要先將字符串參數轉換為字節對象。

    一、數據加密概述


    1. 網絡數據傳輸面臨的威脅

    網絡安全涉及很多方面,而網絡數據的安全傳輸通常會面臨以下幾方面的威脅:

    • 數據竊聽與機密性: 即怎樣保證數據不會因為被截獲或竊聽而暴露。
    • 數據篡改與完整性: 即怎樣保證數據不會被惡意篡改。
    • 身份冒充與身份驗證: 即怎樣保證數據交互雙方的身份沒有被冒充。

    2. 相應的解決方案

    針對以上幾個問題,可以用以下幾種數據加密方式來解決(每種數據加密方式又有多種不同的算法實現):

    數據加密方式描述主要解決的問題常用算法
    對稱加密指數據加密和解密使用相同的密鑰數據的機密性DES, AES
    非對稱加密也叫公鑰加密,指數據加密和解密使用不同的密鑰--密鑰對兒身份驗證DSA,RSA
    單向加密指只能加密數據,而不能解密數據數據的完整性MD5,SHA系列算法

    需要說明的是,上面SHA系列算法是根據生成的密文的長度而命名的各種算法名稱,如SHA1(160bits)、SHA224、SHA256、SHA384等。我們常聽說的MD5算法生成的密文長度為128bits。

    關于上面提到的這些內容,大家可以參考《網絡數據傳輸安全及SSH與HTTPS工作原理》這篇博文來了解更多的信息。本文主要討論的問題是,我們如何使用Python來實現這些數據加密方式。

    二、Python中實現數據加密的模塊簡介


    Python中的大部分功能都是通過模塊提供的,因此我們主要是通過Python中提供的一些內置的模塊或外部模塊來實現上面提到的各種加密算法。使用過程也很簡單,只需要調用這些模塊提供的相應的函數接口即可。

    1. Python內置的加密模塊演化過程

    上面我們已經提到過,單向加密算法有:MD5、SHA系列算法 和 HMAC,而到目前為止Python內置的用于實現數據加密的模塊也主要是提供單向加密功能,并且這些模塊隨著Python版本的迭代也經歷了一些調整和整合:

    • Python2.5之前的版本所提供的加密模塊有:md5、sha和hmac
    • Python2.5開始把對md5和sha算法的實現整合到一個新的模塊:hashlib;
    • Python3.x開始去掉了md5和sha模塊,僅剩下hashlib和hmac模塊;
    • Python3.6增加了一個新的可以產生用于密鑰管理的安全隨機數的模塊:secrets。

    md5模塊和sha模塊為什么會被整合到一個hashlib模塊中呢? 因為md5模塊提供的是MD5算法的實現,sha模塊提供的是SHA1算法的實現,而MD5和SHA1都是hash算法,具體解釋看下面的名詞解釋。

    2. 相關名詞解釋

    • HASH: 一般翻譯為“散列”(也有直接音譯為“哈希”),就是把任意長度的輸入(又叫做預映射,pre-image),通過散列算法,變成固定長度的輸出,該輸出值就是散列值。這種轉換是一種壓縮映射,也就是散列值的空間通常遠小于輸入的空間,不同的輸入可能會散列成相同的輸出,而不可能從散列值來唯一確認輸入值。簡單來說,hash算法就是一種將任意長度的消息壓縮為某一固定長度的消息摘要的函數

    • MD5: 全稱為 Message Digest algorithm 5,即信息摘要算法。該算法可以生成定長的數據指紋,被廣泛應用于加密和解密技術,常用于文件和數據的完整性校驗。

    • SHA: 全稱為 Secure Hash Algorithm,即安全散列算法/安全哈希算法。該算法是數字簽名等密碼學應用中的重要工具,被廣泛應用于電子商務等信息安全領域。根據生成的密文的長度而命名的各種具體的算法有:SHA1(160bits)、SHA224(224bits)、SHA256(256bits)、SHA384(384bits)等。

    • HMAC: 全稱為 Hash Message Authentication Code,即散列消息鑒別碼。HMAC是基于密鑰的哈希算法認證協議,主要是利用哈希算法(如MD5, SHA1),以一個密鑰和一個消息作為輸入,生成一個消息摘要作為輸出,因此其具體的算法名稱為HMAC-MD5、HMAC-SHA1等。可見HMAC算法是基于各種哈希算法的,只是它在運算過程中還可以使用一個密鑰來增強安全性。

    3. 本文要講解的Python內置模塊簡介

    Python早期的相關模塊這里不再介紹了,我們今天主要說明的是以下幾個模塊:

    模塊名內置模塊描述
    hashlibY主要提供了一些常見的單向加密算法(如MD5,SHA等),每種算法都提供了與其同名的函數實現。
    hmacY提供了hmac算法的實現,hamc也是單向加密算法,但是它支持設置一個額外的密鑰(通常被稱為'salt')來提高安全性
    randomY該模塊主要用于一些隨機操作,如獲取一個隨機數,從一個可迭代對象中隨機獲取指定個數的元素。
    secretsY這是Python 3.6中新增的模塊,用于獲取安全隨機數。
    base64Y該模塊主要用于二進制數據與可打印ASCII字符之間的轉換操作,它提供了基于Base16, Base32, 和Base64算法以及實際標準Ascii85和Base85的編碼和解碼函數。
    pycryptoN支持單向加密、對稱加密和公鑰加密以及隨機數操作,這是個第三方模塊,需要額外安裝。

    說明: random模塊嚴格上來講并不能被稱為數據加密模塊,且官方文檔中也強調過該模塊不應該用于數據加密。但是我們在進行數據加密時,還是會常常用到隨機數的操作,所以這里就順便對這個模塊進行下說明。

    三、hashlib與hmac模塊介紹


    hashlib和hmac都是python內置的加密模塊,它們都提供實現了單向加密算法的api。

    1. hashlib模塊

    hashlib模塊簡介:

    hashlib模塊為不同的安全哈希/安全散列(Secure Hash Algorithm)和 信息摘要算法(Message Digest Algorithm)實現了一個公共的、通用的接口,也可以說是一個統一的入口。因為hashlib模塊不僅僅是整合了md5和sha模塊的功能,還提供了對更多中算法的函數實現,如:MD5,SHA1,SHA224,SHA256,SHA384和SHA512。

    提示: “安全哈希/安全散列” 與 “信息摘要” 這兩個術語是可以等價互換的。比較老的算法被稱為消息摘要,而現代屬于都是安全哈希/安全散列。

    hashlib模塊包含的函數與屬性:

    函數名/屬性名描述
    hashlib.new(name[, data])這是一個通用的哈希對象構造函數,用于構造指定的哈希算法所對應的哈希對象。其中name參數用于指定哈希算法名稱,如'md5', 'sha1',不區分大小寫;data是一個可選參數,表示初始數據。
    hashlib.哈希算法名稱()這是一個hashlib.new()的替換方式,可以直接通過具體的哈希算法名稱對應的函數來獲取哈希對象,如 hashlib.md5(),hashlib.sha1()等。
    hashlib.algorithms_guaranteedPython 3.2新增的屬性,它的值是一個該模塊在所有平臺都會支持的哈希算法的名稱集合:set(['sha1', 'sha224', 'sha384', 'sha256', 'sha512', 'md5'])
    hashlib.algorithms_availablePython 3.2新增的屬性,它的值是是一個當前運行的Python解釋器中可用的哈希算法的名稱集合,algorithms_guaranteed將永遠是它的子集。

    hash對象包含的方法與屬性:

    函數名/屬性名描述
    hash.update(data)更新哈希對象所要計算的數據,多次調用為累加效果,如m.update(a); m.update(b)等價于m.update(a+b)
    hash.digest()返回傳遞給update()函數的所有數據的摘要信息--二進制格式的字符串
    hash.hexdigest()返回傳遞給update()函數的所有數據的摘要信息--十六進制格式的字符串
    hash.copy()返回該哈希對象的一個copy("clone"),這個函數可以用來有效的計算共享一個公共初始子串的數據的摘要信息。
    hash.digest_sizehash結果的字節大小,即hash.digest()方法返回結果的字符串長度。這個屬性的值對于一個哈希對象來說是固定的,md5:16,sha1(20), sha224(28)
    hash.block_sizehash算法內部塊的字節大小
    hash.name當前hash對象對應的哈希算法的標準名稱--小寫形式,可以直接傳遞給hashlib.new()函數來創建另外一個同類型的哈希對象。
    hashlib模塊使用步驟:
    • 1)獲取一個哈希算法對應的哈希對象(比如名稱為hash): 可以通過 hashlib.new(哈希算法名稱, 初始出入信息)函數,來獲取這個哈希對象,如hashlib.new('MD5', 'Hello'),hashlib.new('SHA1', 'Hello')等;也可以通過hashlib.哈希算法名稱()來獲取這個哈希對象,如hashlib.md5(), hashlib.sha1()等。

    • 2)設置/追加輸入信息: 調用已得到哈希對象的update(輸入信息)方法可以設置或追加輸入信息,多次調用該方法,等價于把每次傳遞的參數憑借后進行作為一個參數墊底給update()方法。也就是說,多次調用是累加,而不是覆蓋。

    • 3)獲取輸入信息對應的摘要: 調用已得到的哈希對象的digest()方法或hexdigest()方法即可得到傳遞給update()方法的字符串參數的摘要信息。digest()方法返回的摘要信息是一個二進制格式的字符串,其中可能包含非ASCII字符,包括NUL字節,該字符串長度可以通過哈希對象的digest_size屬性獲取;而hexdigest()方法返回的摘要信息是一個16進制格式的字符串,該字符串中只包含16進制的數字,且長度是digest()返回結果長度的2倍,這可用郵件的安全交互或其它非二進制的環境中。

    hashlib模塊使用實例:

    我們以MD5算法為例獲取字符串"Hello, World"的摘要信息(也叫數據指紋)

    import hashlibhash = hashlib.md5() hash.update('Hello, ') hash.update('World!') ret1 = hash.digest() print(type(ret1), len(ret1), ret1) ret2 = hash.hexdigest() print(type(ret2), len(ret2), ret2)

    輸出結果:

    (<type 'str'>, 16, 'e\xa8\xe2}\x88y(81\xb6d\xbd\x8b\x7f\n\xd4') (<type 'str'>, 32, '65a8e27d8879283831b664bd8b7f0ad4')

    分析:

    • digest()方法返回的結果是一個二進制格式的字符串,字符串中的每個元素是一個字節,我們知道1個字節是8bits,MD5算法獲取的數據摘要長度是128bits,因此最后得到的字符串長度是128/8=16;
    • hexdigest()方法返回的結果是一個16進制格式的字符串,字符串中每個元素是一個16進制數字,我們知道每個16進制數字占4bits,MD5算法獲取的數據摘要長度是128bits,因此最后得到的字符串長度是128/4=32。

    在實際工作中,我們通常都是獲取數據指紋的16進制格式,比如我們在數據庫中存放用戶密碼時,不是明文存放的,而是存放密碼的16進制格式的摘要信息。當用戶發起登錄請求時,我們按照相同的哈希算法獲取用戶發送的密碼的摘要信息,與數據中存放的與該賬號對應的密碼摘要信息做比對,兩者一致則驗證成功。

    另外需要說明的是,下面這幾段代碼是等價的:

    hash = hashlib.md5() hash.update('Hello, ') hash.update('World!') hash = hashlib.md5() hash.update('Hello, World!') hash = hashlib.new('md5') hash.update('Hello, World!') hash = hashlib.new('md5', 'Hello, ') hash.update('World!')

    說明: 如果我們想使用其他哈希算法來獲取數據指紋,只需要把上面代碼中的"md5"換成其他算法名即可,如hashlib.sha1(),hashlib.new('sha1')等。

    2. hmac模塊

    hashmac模塊簡介:

    前面說過,HMAC算法也是一種一種單項加密算法,并且它是基于上面各種哈希算法/散列算法的,只是它可以在運算過程中使用一個密鑰來增增強安全性。hmac模塊實現了HAMC算法,提供了相應的函數和方法,且與hashlib提供的api基本一致。

    hmac模塊提供的函數:

    函數名描述
    hmac.new(key, msg=None, digestmod=None)用于創建一個hmac對象,key為密鑰,msg為初始數據,digestmod為所使用的哈希算法,默認為hashlib.md5
    hmac.compare_digest(a, b)比較兩個hmac對象,返回的是a==b的值

    hmac對象中的方法和屬性:

    方法名/屬性名描述
    HMAC.update(msg)同hashlib.update(msg)
    HMAC.digest()同hashlib.digest()
    HMAC.hexdigest()同hashlib.hexdigest()
    HMAC.copy()同hashlib.copy()
    HMAC.digest_size同hashlib.digest_size
    HMAC.block_size同hashlib.block_size
    HMAC.name同hashlib.name
    hmac模塊使用步驟:

    hmac模塊模塊的使用步驟與hashlib模塊的使用步驟基本一致,只是在第1步獲取hmac對象時,只能使用hmac.new()函數,因為hmac模塊沒有提供與具體哈希算法對應的函數來獲取hmac對象。

    hmac模塊使用實例:
    import hmac import hashlibh1 = hmac.new('key', 'Hello, ') h1.update('World!') ret1 = h1.hexdigest() print(type(ret1), len(ret1), ret1)h2 = hmac.new('key', digestmod=hashlib.md5) h2.update('Hello, World!') ret2 = h2.hexdigest() print(type(ret2), len(ret2), ret2)

    輸出結果:

    (<type 'str'>, 32, 'cfad9d610c1e548a03562f8eac399033') (<type 'str'>, 32, 'cfad9d610c1e548a03562f8eac399033')

    四、random與secrets模塊介紹


    random和secrets模塊都是Pytthon內置的隨機數操作模塊,其中secrets模塊是Python 3.6才新增的模塊。

    1. random模塊

    random模塊介紹:

    random模塊實現了一個偽隨機數生成器,可用來生成隨機數以及完成與隨機數相關的功能。下面我們來介紹下該模塊下常用的幾個函數:

    函數名描述
    random.random()用于生成半開區間[0, 1.0)內的一個隨機浮點數
    random.uniform(a, b)用于生成一個指定范文內[a, b]的隨機浮點數
    random.randint(a, b)用于生成一個指定范圍內[a, b]的整數
    random.randrange(start, stop[, step])用于從指定范圍內[start, stop),按指定基數step遞增的集合中獲取一個隨機數,step默認值為1。
    random.randrange(stop)等價于random.randrange(0, stop)
    random.choice(seq)從指定序列seq中隨機獲取一個元素
    random.sample(population, k)從指定序列中隨機獲取k個不重復的元素,并以列表形式返回,用于不進行內容替換的隨機抽樣。
    random.shuffle(x[, random])用于隨機打亂一個列表中元素,需要注意的是該函數操作的是列表對象,且沒有返回值。

    說明:

    • 1)random.sample(population, k)只有在population中沒有重復元素的情況下獲取到的隨機抽樣結果才會有相同的元素;
    • 2)其實上面這些函數都是基于random.random()這個基礎函數實現的;
    • 3)官方文章中有聲明,該模塊完全不適合用作數據加密。
    random模塊實例:
    import randomprint("random.random(): ", random.random()) print("random.uniform(10, 20): ", random.uniform(10, 20)) print("random.randint(10, 20): ", random.randint(10, 20)) print("random.randrange(10, 20, 2): ", random.randrange(10, 20, 2)) print("random.choice('abcd1234'): ", random.choice('abcd1234')) print("random.sample('abcd1234', 3): ", random.sample('abcd1234', 3)) print("random.sample('abcd1234', 3): ", random.sample('abcd1234', 3)) print("random.shuffle([1, 2, 3, 4, 5, 6]): ", random.shuffle([1, 2, 3, 4, 5, 6])) list = [1, 2, 3, 4, 5, 6] random.shuffle(list) print("random.shuffle([1, 2, 3, 4, 5, 6]): ", list)

    輸出結果:

    ('random.random(): ', 0.2967959697940342) ('random.uniform(10, 20): ', 10.774070602657055) ('random.randint(10, 20): ', 18) ('random.randrange(10, 20, 2): ', 18) ("random.choice('abcd1234'): ", 'd') ("random.sample('abcd1234', 3): ", ['d', '1', '4']) ("random.sample('abcd1234', 3): ", ['d', 'd', 'd']) ('random.shuffle([1, 2, 3, 4, 5, 6]): ', None) ('random.shuffle([1, 2, 3, 4, 5, 6]): ', [5, 1, 2, 4, 3, 6])

    再次說明,random.shuffle()的函數沒有返回結果,且其操作的參數必須是一個列表對象。

    2. secrets模塊

    secrets模塊介紹:

    secrets模塊是Python 3.6新增的內置模塊,它可以生成用于管理密碼、賬戶驗證信息、安全令牌和相關秘密信息等數據的密碼強隨機數。需要特別聲明的是,與random模塊中的默認偽隨機數生成器相比,我們應該優先使用secrets模塊,因為random模塊中的默認偽隨機數生成器是為建模和模擬而設計的,不是為安全或密碼學而設計的。總體來講,我們可以通過secrets模塊完成兩種操作:

    • 1)生成安全隨機數
    • 2)生成一個篤定長度的隨機字符串--可用作令牌和安全URL
    secrets模塊提供的函數:

    下面來看下secrets模塊提供的函數:

    函數名描述
    secrets.choice(sequence)功能與random.choice(seq)相同,從指定的非空序列中隨機選擇一個元素并返回
    secrets.randbelow(n)功能與random.randrange(n)相同,從半開區間[0, n)內隨機返回一個整數
    secrets.randbits(k)返回一個帶有k個隨機位的整數
    secrets.token_bytes([nbytes=None])返回一個包含nbytes個字節的隨機字節串
    secrets.token_hex([nbytes=None])返回一個包含nbytes字節的16進制格式的隨機文本字符串,每個字節被轉成成2個16進制數字,這可以用來生成一個隨機密碼
    secrets.token_urlsafe([nbytes])返回一個包含nbytes個字節的隨機安全URL文本字符串,這可以在提供重置密碼的應用中用來生成一個臨時的隨機令牌
    secrets.compare_digest(a, b)比較字符串a和字符串b是否相等,相等則返回True,否則返回False

    如果以上函數中的nbytes參數未提供或設置為None則會取一個合理的默認值。那么生成一個令牌(token)時應該使用多個字節呢? 為了抵抗暴力破解攻擊,令牌需要有足夠的隨機性,當生成令牌使用的字節數越多時,暴力破解需要嘗試的次數就越多。因此,當計算機的計算能力變得更強時,也就意味著計算可以再更短的時間內完成更多的猜測次數。因此,這里所使用的字節個數不應該是一個固定的值,而是應該隨著計算機計算能力的增強而增加。到2015年為止,我們相信32個字節(256bits)的隨機性對于secrets模塊的典型應用場景來說是足夠的了。

    secrets模塊的最佳實踐

    實例1: 生成一個由8位數字和字母組成的隨機密碼

    import secrets import stringalphanum = string.ascii_letters + string.digits password = ''.join(secrets.choice(alphanum) for i in range(8))

    實例2: 生成一個由10位數字和字母組成的隨機密碼,要求至少有一個小寫字符,至少一個大寫字符 和 至少3個數字

    import secrets import stringalphanum = string.ascii_letters + string.digits while True:password = ''.join(secrets.choice(alphanum) for i in range(10))if (any(c.islower() for c in password)and any(c.isupper() for c in password)and len(c.isdigit() for c in password) >= 3):break

    實例3: 生成一個用于找回密碼應用場景的、包含一個安全令牌的、很難猜到的臨時URL

    import secrets url = 'https://mydomain.com/reset=' + secrets.token_urlsafe()

    說明: secrets模塊是Python 3.6新增的內置模塊,盡管官方文檔中強調過random模塊并不適合用來做安全和加密相關的工作,但是在Python 3.6之前我們還是可以用random模塊來模擬secrets模塊提供的這些功能的實現。

    五、base64模塊介紹


    經常聽到有人說“base64加密”,其實base64并不能用于數據加密,它也不是為了純粹的數據加密而生的,它的出現是為了解決不可見字符串的網絡傳輸和數據保存問題。因為,用base64對數據進行轉換的過程不能成為“加密”與“解密”,只能成為“編碼”與“解碼”。下面我們也會用到它,所以這里順便做下簡單的介紹。

    1. base64的作用

    Base64是一種用64個字符來表示任意二進制數據的方法,它是一種通過查表對二進制數據進行編碼的方法,不能用于數據加密。base64最初的出現時為了能夠正確的傳輸郵件數據,因為郵件中的附件(比如圖片)的二進制數中可能存在不可見字符(ascii碼中128-255之間的值是不可見字符),比如我們嘗試用記事本或其他文本編輯器打開一個圖片時,通常都會看到一大堆亂碼,這些亂碼就是不可見字符。由于早期的一些網絡設備和網絡協議是無法正確識別這些字符的,這就可能在數據傳輸時出現各種無法預知的問題。base64的作用就是把含有不可見字符的信息用可見字符來表示(Ascii碼中0-127之間的值是可見字符),從而解決這個問題。

    關于base64的介紹及實現原理可以看看這幾篇文章:

    • http://www.cnblogs.com/wellsoho/archive/2009/12/09/1619924.html
    • https://www.zhihu.com/question/36306744/answer/
    • http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001399413803339f4bbda5c01fc479cbea98b1387390748000

    2. base64的常見應用場景

    base64適用于小段內容的編碼,比如數字證書的簽名、URL、Cookie信息等需要通過網絡進行傳輸的小段數據。關于base64在數字簽名中的應用會在本文后面講解pycrypto模塊使用實例時有具體的應用示例。

    3. base64模塊介紹及簡單使用示例

    Python中有一個內置的base64模塊可直接用來進行base64的編碼和解碼工作--即提供 “二進制數據” 與 “可打印(可見)的ASCII字符”之間的轉換功能。常用的函數有以下幾個:

    函數名描述
    base64.b64encode(s, altchars=None)對二進制數據(字節串)s通過base64進行編碼,返回編碼后的字節串
    base64.b64decode(s, altchars=None, validate=False)對通過base64編碼的字節對象或ASCII字符串s進行解碼,返回解碼后的字節串
    base64.urlsafe_b64encode(s)與b64encode()函數不同的是,它會把標準Base64編碼結果中的字符'+'和字符'/'分別替換成字符'-'和字符'_'。
    base64.urlsafe_b64decode(s)解碼通過base64.urlsafe_b64encode()函數編碼的字節對象或ASCII字符串s。

    提示: URL中有一些有特殊意義的字符,也就是保留字符:';', '/', '?', ':', '@', '&', '=', '+', '$' 和 ',' ,在URL的參數值中應該避免這些字符的出現。

    下面來看個簡單的示例:

    import base64data = 'hello, 世界!' based_data1 = base64.b64encode(data) plain_data1 = base64.b64decode(based_data1) based_data2 = base64.urlsafe_b64encode(data) plain_data2 = base64.urlsafe_b64decode(based_data2) print(based_data1) print(based_data2) print(plain_data1) print(plain_data2)

    輸出結果:

    aGVsbG8sIOS4lueVjO+8gQ== aGVsbG8sIOS4lueVjO-8gQ== hello, 世界! hello, 世界!

    3. base64編碼結果后的等號'='

    通過上面的這個簡單示例的輸出結果會發現,隨翻urlsafe_b64encode()函數會把編碼結果中的字符'+'和字符'/'替換成其他URL的非保留字符,但是它的編碼結果中還是可能出現字符'='。那么這些字符'='代表什么呢?能否去掉呢?

    其實base64編碼的過程中會先把原來數據中的每3個字節的二進制數據編碼為4個字節的文本數據,當原始數據最后不滿3個字節時就需要用'\00'字節進行補位湊夠3個字節,而且會在編碼結果的最后加上相應個數的'='號來表示補了多少個字節,這樣解碼的時候就可以去掉那些補位的字節。

    由此我們可以得出兩個結論:

    • 1)base64編碼后的結果的末尾可能存在字符'='個數分別是:0個、1個和2個;
    • 2)base64編碼后的結果應該是4的倍數。

    基于以上第2個結論,為了避免編碼結果中可能出現的的字符'='對網絡數據傳輸造成影響,可以在傳出前去掉后面的字符'=',接收方可以通過對數據的長度對4求模得到應該補上的字符'='個數,從而得到正確的數據。比如,我們可以通過下面這個解碼函數來完成這個過程:

    import base64def safe_b64decode(s):length = len(s) % 4for i in range(length):s = s + '='return base64.b64decode(s)if __name__ == '__main__':print(safe_b64decode('aGVsbG8sIOS4lueVjO+8gQ=='))print(safe_b64decode('aGVsbG8sIOS4lueVjO+8gQ='))print(safe_b64decode('aGVsbG8sIOS4lueVjO+8gQ'))

    輸出結果:

    hello, 世界! hello, 世界! hello, 世界!

    可見,雖然我們把上面那個示例中通過base64編碼后的結果后面的字符'='去掉了,通過我們自己定義的safe_b64decode()函數最終得到了正確的解碼結果。

    六、pycrypto模塊


    1. pycryto模塊介紹

    pycryto模塊不是Python的內置模塊,它的官方網站地址是這里。pycrypto模塊是一個實現了各種算法和協議的加密模塊的結合,提供了各種加密方式對應的多種加密算法的實現,包括 單向加密、對稱加密以及公鑰加密和隨機數操作。而上面介紹的hashlib和hmac雖然是Python的內置模塊,但是它們只提供了單向加密相關算法的實現,如果要使用對稱加密算法(如, DES,AES等)或者公鑰加密算法我們通常都是使用pycryto這個第三方模塊來實現。

    需要注意的是,pycrypto模塊最外層的包(package)不是pycrypto,而是Crypto。它根據加密方式類別的不同把各種加密方法的實現分別放到了不同的子包(sub packages)中,且每個加密算法都是以單獨的Python模塊(一個.py文件)存在的。我們來看下這些子包:

    包名描述
    Crypto.Hash該包中主要存放的是單向加密對應的各種哈希算法/散列算法的實現模塊,如MD5.py, SHA.py,SHA256.py等。
    Crypto.Cipher該包中主要存放的是對稱加密對應的各種加密算法的實現模塊,如DES.py, AES.py, ARC4.py等;以及公鑰加密對應的各種加密算法的實現模塊,如PKCS1_v1_5.py等。
    Crypto.PublicKey該包中主要存放的是公鑰加密與簽名算法的實現模塊,如RSA.py, DSA.py等。
    Crypto.Signatue該包中主要存放的是公鑰簽名相關算法的實現模塊,如PKCS1_PSS.py, PKCS1_v1_5.py。
    Crypto.Random該包中只有一個隨機數操作的實現模塊 random.py
    Crypto.Protocol該包中存放的是一些加密協議的實現模塊,如Chaffing.py, KDF.py等。
    Crypto.Util該包存放的是一些有用的模塊和函數

    這里需要說明的是,Crypto.PublicKey子包下的RSA.py和DSA.py模塊只是用來生成秘鑰對的,而基于公鑰的加密與解密功能是由Crypto.Cipher子包下的PKCS1_v1_5.py或PKCS1_OAEP.py以這個密鑰對兒為密鑰來實現的;同樣,簽名與驗證相關算法的功能是由Crypto.Signature子包下的PKCS1_v1_5.py和PKCS1_PASS.py以這個密鑰對而為密鑰來實現的。

    2. pycrypto的安裝與使用

    pycrypto的安裝

    由于pycryto不是Python的內置模塊,所以在使用它之前需要通過Python模塊管理工具(如pip)來安裝。不幸的是,如果你使用的是Windows平臺會遇到一些問題,比如執行pip install pycryto命令來安裝pycrpto時可能會得到以下錯誤提示信息:

    error: Microsoft Visual C++ 9.0 is required (Unable to find vcvarsall.bat).

    error: Unable to find vcvarsall.bat

    這是由于pycrypto模塊是用C語言實現的,Python模塊管理工具在安裝它時需要使用C/C++編譯工具對它的代碼進行編譯,但是找不到對應版本的編譯工具,具體解釋及解決方案請查看《這篇博文》。

    pycrypto的使用方式

    由于pycrypto把不同的類別加密算法的實現模塊都放到了Crypto下不同的子包下了,所以我們只需要確定我們所需要使用的加密算法的實現模塊在哪個子包下,然后導入相應的實現模塊就可以使用了。比如我們打算使用MD5算法,就可以通過from Crypto.Hash import MD5來導入MD5這個模塊,然后就可以使用該模塊相應的api了。

    pycrypto使用實例

    實例1: 使用SHA256算法獲取一段數據的摘要信息

    from Crypto.Hash import SHA256hash = SHA256.new() hash.update('Hello, World!') digest = hash.hexdigest() print(digest)

    輸出結果:

    dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f

    實例2: 使用AES算法加密,解密一段數據

    from Crypto.Cipher import AES# 加密與解密所使用的密鑰,長度必須是16的倍數 secret_key = "ThisIs SecretKey" # 要加密的明文數據,長度必須是16的倍數 plain_data = "Hello, World123!" # IV參數,長度必須是16的倍數 iv_param = 'This is an IV456'# 數據加密 aes1 = AES.new(secret_key, AES.MODE_CBC, iv_param) cipher_data = aes1.encrypt(plain_data) print('cipher data:', cipher_data)# 數據解密 aes2 = AES.new(secret_key, AES.MODE_CBC, 'This is an IV456') plain_data2 = aes2.decrypt(cipher_data) # 解密后的明文數據 print('plain text:', plain_data2)

    輸出結果:

    ('cipher data\xef\xbc\x9a', '\xcb\x7fd\x03\x12T,\xbe\x91\xac\x1a\xd5\xaa\xe6P\x9a') ('plain text\xef\xbc\x9a', 'Hello, World123!')

    實例3: 隨機數操作

    from Crypto.Random import randomprint('random.randint: ', random.randint(10, 20)) print('random.randrange: ', random.randrange(10, 20, 2)) print('random.randint: ', random.getrandbits(3)) print('random.choice: ', random.choice([1, 2, 3, 4, 5])) print('random.sample: ', random.sample([1, 2, 3, 4, 5], 3)) list = [1, 2, 3, 4, 5] random.shuffle(list) print('random.shuffle: ', list)

    輸出結果:

    ('random.randint: ', 10L) ('random.randrange: ', 10L) ('random.randint: ', 5L) ('random.choice: ', 5) ('random.sample: ', [5, 4, 2]) ('random.shuffle: ', [5, 2, 1, 3, 4])

    實例4: 使用RSA算法生成密鑰對兒

    生成秘鑰對:

    from Crypto import Random from Crypto.PublicKey import RSA# 獲取一個偽隨機數生成器 random_generator = Random.new().read # 獲取一個rsa算法對應的密鑰對生成器實例 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)

    私鑰文件rsa.key的內容為:

    -----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-----

    公鑰文件rsa.pub的內容為:

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

    實例5: 公鑰加密算法的實現

    前面說過,公鑰加密算法是由Crypto.Cipher子包下的PKCS1_v1_5.py或PKCS1_OAEP.py模塊以已經存在的密鑰對兒為密鑰來實現的,現在常用的是PKCS1_v1_5。另外,我們前面提到過,使用對方的公鑰加密,使用對方的私鑰解密才能保證數據的機密性,因此這里以上面生成的公鑰進行加密數據,以上面生成的私鑰解密數據:

    from Crypto import Random from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_v1_5 as Cipher_PKCS1_v1_5 import base64# 數據加密 message = "This is a plain text." with open('rsa.pub', 'r') as f:public_key = f.read()rsa_key_obj = RSA.importKey(public_key)cipher_obj = Cipher_PKCS1_v1_5.new(rsa_key_obj)cipher_text = base64.b64encode(cipher_obj.encrypt(message))print('cipher test: ', cipher_text)# 數據解密 with open('rsa.key', 'r') as f:private_key = f.read()rsa_key_obj = RSA.importKey(private_key)cipher_obj = Cipher_PKCS1_v1_5.new(rsa_key_obj)random_generator = Random.new().readplain_text = cipher_obj.decrypt(base64.b64decode(cipher_text), random_generator)print('plain text: ', plain_text)

    輸出結果:

    ('cipher test: ', 'oq1sOSz4lS9PgrKmiwuAHs7iUhmWMvWdEbXLTOdhGtyIAr6xwmjtnBNpuvMVIM2Mz/O/xVzPu5L8nzUVW2THKpQinNwC7JWF0wnxrTHwKrmfXIIxxibQJS02obxkoEeqrjRo0b8V7yktYIV3ig2SlU3yjcr+lOFmRX+h6dE2TAI=') ('plain text: ', 'This is a plain text.')

    實例6: 數據簽名與簽名驗證的實現

    同樣,簽名與驗證相關算法的功能是由Crypto.Signature子包下的PKCS1_v1_5.py和PKCS1_PASS.py以這個密鑰對而為密鑰來實現的。數據簽名的目的是為了防止別人篡改發送人的原始數據,其原理是:

    • 1)先以單向加密方式通過某種哈希算法(如MD5,SHA1等)對要發送的數據生成摘要信息(數據指紋);
    • 2)然后發送方用自己密鑰對兒中的私鑰對這個摘要信息進行加密;
    • 3)數據接收方用發送的公鑰對加密后的摘要信息進行解密,得到數據摘要的明文A;
    • 4)數據接收方再通過相同的哈希算法計算得到數據摘要信息B;
    • 5)數據接收方對比數據摘要A與數據摘要B,如果兩者一致說明數據沒有被篡改過。
    from Crypto.Hash import SHA from Crypto.Signature import PKCS1_v1_5 as Signature_PKCS1_v1_5 message = "This is the message to send." # 數據簽名 with open('rsa.key', 'r') as f:private_key = f.read()rsa_key_obj = RSA.importKey(private_key)signer = Signature_PKCS1_v1_5.new(rsa_key_obj)digest = SHA.new()digest.update(message)signature = base64.b64encode(signer.sign(digest))print('signature text: ', signature)# 驗證簽名 with open('rsa.pub', 'r') as f:public_key = f.read()rsa_key_obj = RSA.importKey(public_key)signer = Signature_PKCS1_v1_5.new(rsa_key_obj)digest = SHA.new(message)is_ok = signer.verify(digest, base64.b64decode(signature))print('is ok: ', is_ok)

    輸出結果:

    ('signature text: ', 'Bb4gvPU9Ji63kk3SSTiAVLctDbdb91DQuQKecbTcO2Jvpwbr7fr9sKZO+vZ8LIuSOdJkhbGX6swsSNwDI/CoT0xCdjiasfySPgsLyTcSWLyy9P7SrDuveH1ABUR/oYisvT1wFsScu0NMOBR8sLpboPk2DiW6n400jZq7t09xUyc=') ('is ok: ', True)

    上面這幾個關于pycrpto的使用實例來自這里。

    七、總結


    上面講了很多內容,現在我們簡單總結下:

    • 數據加密方式大體分為3類:單向加密、對稱加密 和 公鑰加密(非對稱加密)。
    • 這3類加密方式都各自包含不同的加密算法,如單向加密方式中包含MD5、SHA1、SHA256等,這些算法又稱為“哈希算法”或“散列算法”或“數據摘要算法”
    • Python內置的hashlib和hmac只提供了單向加密的各種算法實現,如果要做對稱加密或者公鑰加密操作需要安裝第三方擴展模塊,常用的是pycrypto模塊。另外,hmac允許在使用哈希算法計算數據摘要時使用一個密鑰。
    • 隨機數操作可以通過三個模塊來做,Python內置的random模塊和secrets模塊(Python 3.6中才可用),還可以通過pycrypto模塊中的Crypto.Random子包中的模塊來完成。
    • base64只適合編碼小段數據,且不能用于數據加密(算法是公開的,且沒有密鑰,所有人都可以解碼)
    • pycrypto是一個加密算法庫,幾乎所有的加密算法都可以在它里面找到相應的實現模塊。

    八、參考文檔


    • https://docs.python.org/3/library/hashlib.html
    • https://docs.python.org/3/library/hmac.html
    • https://docs.python.org/3/library/random.html
    • https://docs.python.org/3/library/secrets.html
    • https://www.dlitz.net/software/pycrypto/
    • 相關源碼的注釋信息

    轉載來源:https://www.cnblogs.com/yyds/p/7072492.html

    ?

    轉載于:https://www.cnblogs.com/honey-badger/p/9742643.html

    創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的Python之数据加密与解密(hashlib、hmac、random、base64、pycrypto)--转载的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    亚洲高清网站 | 99精品国产免费久久久久久下载 | 亚洲一区二区三区四区在线视频 | 欧美日韩在线视频一区二区 | 在线看国产日韩 | 亚洲欧美成aⅴ人在线观看 四虎在线观看 | 天天干天天操天天爱 | 国产又粗又硬又长又爽的视频 | 97视频在线观看免费 | 国产精品入口66mio女同 | 国产成人精品一区二区三区在线观看 | 亚洲欧美综合 | 久久欧美精品 | 国产日韩精品在线观看 | 中文免费在线观看 | av大片网址 | 国产伦精品一区二区三区高清 | 欧美一性一交一乱 | 免费看一级特黄a大片 | 欧美成人基地 | 久久国产精品久久久久 | 亚洲精品黄色在线观看 | 欧美日韩精品网站 | 1024手机基地在线观看 | 色噜噜日韩精品欧美一区二区 | 人成在线免费视频 | 九九久| 久久精品一区二区三区国产主播 | 国内99视频 | 97色综合| 在线播放一区二区三区 | 亚洲一区二区精品3399 | 欧美日韩首页 | 欧美一级日韩免费不卡 | 亚洲视频国产 | 豆豆色资源网xfplay | 六月丁香激情综合色啪小说 | 黄色亚洲片 | 免费久久精品视频 | 中文字幕在线观看网站 | 亚洲在线视频免费 | а天堂中文最新一区二区三区 | 国产精品久久久久久久久久久久冷 | 欧美午夜久久久 | 亚洲精品美女久久久 | 成人免费在线网 | 国产亚洲精品久久久久久久久久久久 | 日韩一二三在线 | av网站免费线看精品 | 国产成人专区 | 国产日韩精品一区二区三区 | 91视频xxxx| 99精品视频一区 | 久草亚洲视频 | 国产精品系列在线观看 | 成人国产精品一区 | 一二三精品视频 | 欧美色图狠狠干 | 91自拍视频在线观看 | 伊人色综合久久天天网 | 美女免费电影 | 日韩激情三级 | 99久久精品久久久久久动态片 | 欧美一级日韩免费不卡 | 久久中文字幕在线视频 | 99久久这里有精品 | 国产成人精品一区二三区 | 久精品视频在线观看 | 免费黄在线观看 | 18国产精品白浆在线观看免费 | 亚洲综合精品视频 | 91精品一区二区三区蜜桃 | 日本三级久久 | 久久在线视频精品 | 日韩欧美亚州 | 一区在线观看 | 青春草国产视频 | 一区二区三区四区在线 | 视色网站 | 亚洲男人天堂a | 久久久久久国产精品久久 | 91亚洲欧美激情 | 日本久久久影视 | av大片免费在线观看 | 精品久久久久久亚洲综合网站 | 亚洲精品99久久久久中文字幕 | 天天久久夜夜 | 免费观看的黄色片 | 久久中文网 | 91最新视频在线观看 | 在线色吧 | 99精品视频一区二区 | 天天操夜夜曰 | 色欧美成人精品a∨在线观看 | 亚洲三级黄色 | 一区二区三区三区在线 | 美女精品久久久 | 操久久免费视频 | 欧美在线不卡一区 | 国产精品九九久久99视频 | 国产日韩欧美在线播放 | 国产精品一区二区在线看 | 中文字幕在线播放av | 中文在线免费看视频 | 亚洲人成免费 | 色爽网站 | 日韩欧美一区二区在线 | 中文字幕一区二区三区四区久久 | 97人人视频| 日本韩国在线不卡 | 中文字幕免费久久 | 久久超碰网 | 国产成人精品一区二区三区福利 | 日韩欧美视频免费在线观看 | 黄色一级大片在线免费看国产一 | 中文字幕在线免费97 | 日韩国产高清在线 | 天天艹天天爽 | 国产精品尤物视频 | a国产精品 | 国产 日韩 欧美 自拍 | 日韩视频图片 | 精品自拍sae8—视频 | 亚洲国产操 | 亚洲欧美日韩在线一区二区 | 国内精品久久久久久久久久久 | 亚洲黄色成人av | 又粗又长又大又爽又黄少妇毛片 | 色九色| 亚洲精品自拍视频在线观看 | 爱射综合 | 国产又粗又长又硬免费视频 | 色婷婷激情五月 | 欧美成亚洲 | 在线观看完整版 | 91高清视频免费 | 中文字幕日韩有码 | 91免费观看视频在线 | 国产小视频免费在线观看 | 探花视频在线观看免费版 | 99精品国产一区二区三区麻豆 | 日韩电影一区二区三区 | 热久久国产 | 午夜视频在线观看一区 | 97国产大学生情侣酒店的特点 | 久久手机视频 | 久热免费在线 | 欧美色综合天天久久综合精品 | 亚洲va男人天堂 | 成年人在线看片 | 久章草在线观看 | 精品播放| 九九九九精品九九九九 | 在线观看黄色 | 免费情缘 | av一级久久| 精品国产自在精品国产精野外直播 | 不卡av在线| 亚洲播放一区 | av在线a| 日韩欧美xxx | 色天天综合久久久久综合片 | 日日操天天射 | 亚洲麻豆精品 | 日本电影久久 | 丁香婷婷色月天 | 免费美女久久99 | 狠狠干网址 | 9久久精品| 国产高清一| av三级av | 四川妇女搡bbbb搡bbbb搡 | 超碰国产在线播放 | 九九在线视频免费观看 | 久久av影视 | 美女在线观看av | 成年人黄色免费网站 | 亚洲精品美女久久久久网站 | a黄色片 | 亚洲精品欧美精品 | 国产视频在线看 | 久久精品一二三区 | 综合色婷婷 | 综合网欧美 | 国产高清福利在线 | 亚洲乱码在线观看 | 91综合视频在线观看 | wwwav视频| 亚洲精品视频 | a视频在线播放 | 日韩免费观看av | 美女国内精品自产拍在线播放 | 国产黄色在线网站 | 久久99在线观看 | 亚洲精品在线播放视频 | 99 国产精品 | 国产日韩精品在线观看 | 国产一区91| 国产一级片免费视频 | 婷婷伊人综合 | 天天舔天天射天天操 | 91亚洲在线| 热久久国产精品 | 日韩三区在线观看 | 麻豆视频免费网站 | 91系列在线 | 一区二区三区福利 | 日韩精品一区二区三区在线播放 | 天堂av在线网 | 欧洲视频一区 | 国产精品成人久久久久久久 | 久久久免费精品国产一区二区 | 国产一级免费片 | 九九久久国产精品 | 国产一区二区三区网站 | 永久免费毛片在线观看 | 国产精品综合在线观看 | 亚洲国产精品日韩 | 久久草网站 | 久久另类小说 | 色婷婷免费| 91资源在线免费观看 | 久久久久久久久毛片精品 | 国产在线理论片 | 中文字幕精 | 九九热99视频 | 国产免费又粗又猛又爽 | 四虎影视成人精品 | 国产视频2区 | 在线视频一区二区 | 91亚洲狠狠婷婷综合久久久 | 99精品福利 | 色网站黄 | 久久免费中文视频 | 国产精品一区二区久久久 | 在线看欧美 | 91在线成人 | 免费观看一级一片 | 国产成人精品一区二 | 婷婷视频 | 在线观看视频一区二区三区 | 一级欧美日韩 | 天天色天天射天天操 | 日韩高清在线一区 | 91大神电影 | 久久久久亚洲精品中文字幕 | 久久久电影 | 97免费在线观看视频 | 在线国产欧美 | 天天综合久久综合 | 干干操操 | 亚洲国产精品日韩 | 日本久久久影视 | 久久久久久久久久久国产精品 | 青青色影院 | 日韩区在线观看 | 国产涩涩网站 | 欧美日韩免费视频 | 国产精品久久久久国产精品日日 | 香蕉视频在线观看免费 | 中文字幕人成人 | 亚洲视频精品 | 免费在线观看国产精品 | 国产高清视频免费最新在线 | 久久69精品久久久久久久电影好 | avlulu久久精品 | 91高清视频在线 | 国产精品二区在线 | 午夜三级在线 | 黄色免费av | av中文国产| 精品国自产在线观看 | 国产成人高清在线 | 亚洲国产av精品毛片鲁大师 | 久久久久亚洲精品中文字幕 | 91社区国产高清 | 久久a国产 | 蜜臀av夜夜澡人人爽人人桃色 | 精品国产美女 | 日韩免费电影一区二区三区 | 午夜久久影视 | 在线播放一区二区三区 | 色偷偷网站视频 | www天天干com| 久久午夜剧场 | 久久久久观看 | 日韩网站在线看片你懂的 | 不卡电影一区二区三区 | 久久久久久久国产精品 | 久久精品二区 | 欧美日韩超碰 | 中文字幕在线播放av | 超级碰视频 | 欧洲精品码一区二区三区免费看 | 一本到视频在线观看 | 日韩最新在线 | 久久综合九色综合97_ 久久久 | 欧美性大战 | 一级片免费观看 | 91精品对白一区国产伦 | 色综合中文字幕 | 亚洲理论视频 | 9在线观看免费高清完整版在线观看明 | 久久久在线视频 | 国产精品一区二区视频 | 久久1区| 人人澡人人爽欧一区 | 91视频免费看 | 久久久久久国产精品久久 | 国产成人一区二区在线观看 | 狠狠黄 | 国产精品久久久99 | 天天色天天操天天爽 | 人人躁| 99热这里只有精品国产首页 | 911精品视频 | 一区二区不卡高清 | 在线视频国产区 | 亚洲精品午夜久久久久久久久久久 | 丁香资源影视免费观看 | 午夜在线免费观看 | 又粗又长又大又爽又黄少妇毛片 | 91成人亚洲 | 国产aa精品 | 国产日产精品一区二区三区四区 | 黄色电影在线免费观看 | 一区二区中文字幕在线播放 | 国产超碰在线 | 日韩一区二区三区高清在线观看 | 91精品秘密在线观看 | av在线免费播放网站 | 男女啪啪网站 | 2019av在线视频 | 91中文字幕永久在线 | 久久久国产精品麻豆 | 国内精品久久影院 | 色av婷婷| 青青草视频精品 | 国产小视频在线观看 | 一区三区视频在线观看 | 日韩精品一区电影 | 在线看国产一区 | 精品一区二区亚洲 | 久久视频一区 | 日本黄色a级大片 | 日本久久精品 | 国产精品一区二区久久精品爱微奶 | 亚洲国产成人精品电影在线观看 | 亚洲狠狠操 | 久久久久久草 | 亚洲砖区区免费 | 在线视频你懂得 | 国内精品久久久久影院日本资源 | 日韩精品短视频 | 91成人精品国产刺激国语对白 | 国产午夜精品一区二区三区嫩草 | 韩国av一区二区 | 国产精品手机在线观看 | 日韩v欧美v日本v亚洲v国产v | 一级免费看视频 | 日韩久久久久久久久 | 亚洲国产播放 | 在线影院中文字幕 | 福利一区二区 | 亚洲天堂精品视频在线观看 | 日日夜夜av | 91九色精品国产 | 欧美日韩二区在线 | 成人av观看| 最近中文字幕高清字幕免费mv | 午夜精品电影 | 一级黄色片在线观看 | 亚洲精品一区二区精华 | 精品国产视频一区 | 免费美女av | 午夜精品久久久久久久99婷婷 | av电影免费在线看 | 中文字幕在线观看亚洲 | 天天干天天草天天爽 | 免费一级黄色 | 西西www444| 成人av电影免费在线播放 | 久久99精品久久久久蜜臀 | 欧美婷婷综合 | 91精品欧美| 久久综合国产伦精品免费 | 美女黄频视频大全 | 99视频在线观看视频 | 天天色天天色 | 亚洲精品合集 | 久草99 | 五月婷婷狠狠 | 久久成人麻豆午夜电影 | 一区二区三区精品在线 | 亚洲专区中文字幕 | 日本精品久久久久中文字幕5 | 麻豆久久精品 | 999视频在线播放 | 国产精品毛片一区视频 | 爱射综合 | 日本久久片 | 免费国产在线观看 | 亚洲婷婷在线视频 | 国产精品18videosex性欧美 | 四虎最新入口 | 日日夜av| 日韩在线观 | 日日日日日 | 正在播放国产一区二区 | 亚洲人成在线观看 | 色多多污污在线观看 | 国产裸体视频网站 | 看片网站黄 | 欧美aⅴ在线观看 | 成人av在线一区二区 | 日韩 国产 | 久草国产在线观看 | 精品一二三四五区 | 欧美精品乱码久久久久久按摩 | 成年人av在线播放 | 久草在线综合网 | 欧女人精69xxxxxx | 国产成人av网 | 国产欧美最新羞羞视频在线观看 | 国产午夜影院 | 黄色毛片视频免费 | 在线免费色视频 | 免费成人在线视频网站 | 曰本免费av | 97成人免费 | 91桃色在线免费观看 | 在线免费看片 | 天堂在线一区二区三区 | 综合久久久久久久久 | 色吊丝在线永久观看最新版本 | 综合激情网 | 五月天综合 | bbbbb女女女女女bbbbb国产 | 色九九在线 | 亚洲精品久久久蜜桃直播 | 中日韩三级视频 | 超碰在线亚洲 | 伊色综合久久之综合久久 | 一区二区国产精品 | 7777精品伊人久久久大香线蕉 | 高清在线一区二区 | 免费观看xxxx9999片 | 久久狠狠一本精品综合网 | 99久久综合国产精品二区 | 日韩一级电影网站 | 91精品亚洲影视在线观看 | 狠狠狠操 | 国产原创在线视频 | 久久曰视频 | 一级免费观看 | 日本爱爱免费视频 | 九九九热| 欧美激情第一区 | 久久国内精品视频 | 国产精品2区 | 91九色蝌蚪国产 | 欧美巨大 | 亚洲另类在线视频 | 精品久久久久一区二区国产 | 亚洲精品美女视频 | 日韩在线免费 | 欧美视频一区二 | 又黄又刺激 | 深爱激情站 | 国产一二区在线观看 | 精品在线你懂的 | 欧美最猛性xxx | 国产精品一区免费观看 | 久久国产手机看片 | 伊人婷婷| 最新av网址在线观看 | 日韩大片免费观看 | 久久久久区 | 成年人视频在线免费观看 | 免费看成人片 | 亚洲国产欧美一区二区三区丁香婷 | 日韩av三区 | 成人国产精品一区二区 | 91色吧 | 玖玖在线免费视频 | 免费av大全 | 99久久精品费精品 | 99操视频| 久久久国产一区 | 2019天天干夜夜操 | 99色| 99久久久国产精品免费99 | 亚洲少妇xxxx | 免费看色网站 | 久久99国产视频 | 激情综合五月天 | 一区二区三区国产欧美 | 国产精品99久久久久 | 美女视频永久黄网站免费观看国产 | 亚洲免费永久精品国产 | 免费在线观看亚洲视频 | 四虎国产精品成人免费4hu | 香蕉网在线 | 国产免费一区二区三区最新6 | 日韩中文在线字幕 | 有码中文字幕在线观看 | 亚洲精品免费观看 | 国产精品免费小视频 | 午夜精品久久久久久久久久久久久久 | 91亚洲精品国产 | 日韩高清精品一区二区 | 91激情小视频 | 天天操人 | 一区二区男女 | 日韩系列在线 | 国产成人三级一区二区在线观看一 | 欧美一级片播放 | 精品国产区 | 久久中国精品 | ,午夜性刺激免费看视频 | 人人爽人人射 | 色五月色开心色婷婷色丁香 | 成人av一区二区兰花在线播放 | 亚洲精品国产综合99久久夜夜嗨 | 国产美女久久 | 国产亚洲精品久久久久久网站 | 国内精品久久久精品电影院 | 亚洲精品一区二区网址 | 香蕉影视| 国产 一区二区三区 在线 | 视频二区在线 | 91欧美视频网站 | 国产伦精品一区二区三区高清 | 97网| 亚洲国产播放 | 久久8| japanesefreesexvideo高潮 | 婷婷久久网站 | av手机版 | 欧美日韩在线免费观看视频 | 亚洲精品国偷拍自产在线观看蜜桃 | 欧美视频在线二区 | 99综合电影在线视频 | 日韩在线观看av | 激情五月婷婷网 | 人人澡澡人人 | 五月婷婷激情 | 色婷婷福利视频 | 日日爱夜夜爱 | 国产成视频在线观看 | 97精品视频在线播放 | 国产精品99久久久久久久久 | 日本精品中文字幕 | 亚洲精品视频免费在线观看 | 久久免费观看少妇a级毛片 久久久久成人免费 | 午夜精品久久久久久久99 | 免费不卡中文字幕视频 | 久久人人精品 | 天天天天天天天天操 | 国产精品久久久久久久毛片 | 日日干天天爽 | 天天干天天操天天爱 | 中文字幕成人av | 国产成人精品免费在线观看 | 99久久精品久久亚洲精品 | 9ⅰ精品久久久久久久久中文字幕 | 超碰免费久久 | 毛片a级片| 伊人婷婷综合 | 欧美一级电影在线观看 | 黄色亚洲 | www.日本色| 欧美一区在线观看视频 | 久草在线最新免费 | 欧美一级片免费在线观看 | 国产成人精品在线观看 | 亚洲国产日韩一区 | 色国产精品一区在线观看 | 亚洲美女精品视频 | 日韩精品资源 | 天天操天天操天天操 | 亚洲精品久久在线 | 91精品人成在线观看 | 天堂av色婷婷一区二区三区 | 久久精品一二三 | 免费黄色一区 | 欧美性脚交 | av国产网站 | 亚洲精品男人的天堂 | 欧美高清成人 | 国产美女网站在线观看 | 香蕉97视频观看在线观看 | 国内久久久久久 | 99精品久久99久久久久 | 97高清视频 | 又黄又爽又湿又无遮挡的在线视频 | 毛片一区二区 | 国产成人精品一区二区三区在线观看 | 国产一区免费观看 | 国产一级免费观看视频 | 激情网综合 | 91污视频在线观看 | 最新国产在线 | 久久电影国产免费久久电影 | 国产精品久久久久久999 | 欧美久草在线 | 亚洲最大在线视频 | 日韩在线视频线视频免费网站 | 18网站在线观看 | 最新av网站在线观看 | 人人爽人人爽人人爽人人爽 | 国产精品专区在线 | 欧美日韩一区二区三区在线观看视频 | 免费视频91 | 欧美特一级片 | 福利区在线观看 | 最近中文字幕视频完整版 | 国产自产高清不卡 | 91久久人澡人人添人人爽欧美 | 国产黄色一级片在线 | 日韩国产精品久久久久久亚洲 | 国产999| 国产一级不卡视频 | 精品国产网址 | 欧美夫妻性生活电影 | 欧美精品在线免费 | 91亚洲精 | 国产视频久久久 | 色亚洲网 | 国产v在线 | av在线h | 久久99国产综合精品免费 | 欧美巨大荫蒂茸毛毛人妖 | 色黄视频免费观看 | 婷婷精品| 日韩免费网址 | 日本精品视频免费 | 少妇性色午夜淫片aaaze | 黄色av一级片 | 超碰激情在线 | 最近高清中文字幕在线国语5 | 91麻豆精品国产91久久久无需广告 | 狠狠躁夜夜av | 日本在线观看中文字幕 | 久久这里只有精品视频99 | 日韩一区二区三区观看 | 国产免费国产 | 中文字幕在线一区观看 | 国产精品一区二区免费看 | 在线观看黄色av | 男女全黄一级一级高潮免费看 | 高清不卡毛片 | 精品久久99 | 字幕网av| 中文字幕一区二区三区久久 | 91精品国自产在线偷拍蜜桃 | 欧美视频xxx| 亚洲综合在线视频 | 国产黄免费 | 欧美激情视频在线观看免费 | 成人免费在线视频 | 午夜久久福利 | 久草在线免费新视频 | 欧美日韩一区二区免费在线观看 | av中文字幕网 | 欧美污网站 | 91大神dom调教在线观看 | 青青久草在线视频 | 在线观看视频一区二区 | 91麻豆.com| 久久综合九色欧美综合狠狠 | 日韩激情综合 | 亚洲一区二区高潮无套美女 | 亚洲一级国产 | www色| 中文字幕 国产专区 | 国产91精品久久久久久 | 五月婷婷中文网 | 日韩电影精品一区 | 18久久久| 91精品一区二区三区蜜臀 | 亚洲黄污 | 色婷婷国产精品 | 国产不卡在线视频 | 高清久久久久久 | 一区二区影院 | 国产91综合一区在线观看 | 麻豆你懂的 | 欧美色图亚洲图片 | 国产录像在线观看 | 国产成人精品女人久久久 | 国产精品 国内视频 | 久久久久黄 | 日本精品一二区 | 色综合久久久久综合99 | 色姑娘综合网 | 黄色免费观看 | 99久久婷婷国产综合精品 | 久久综合狠狠综合 | 黄色网址在线播放 | 欧美精品小视频 | 亚洲午夜精品一区 | 网站在线观看日韩 | 精品久久久免费 | 久久免费视频99 | 六月丁香在线观看 | 国产精品久久久久久超碰 | 欧美另类高清 | 成人h电影 | 色福利网站 | 91片黄在线观 | 亚洲黄色在线免费观看 | 中文字幕你懂的 | 国产精品久久久久久高潮 | 日本婷婷色| 四虎影视成人精品 | 九九热只有精品 | 97免费在线观看视频 | 国产香蕉97碰碰久久人人 | 国产爽妇网 | 美女网站色免费 | 黄色一级片视频 | 国产香蕉视频在线播放 | 97在线观看视频国产 | 最近中文字幕mv | 欧洲一区二区在线观看 | 久久精品艹 | 成年人免费在线观看网站 | 激情av资源| 黄色高清视频在线观看 | 狠狠操夜夜操 | 高清久久久久久 | 久久成人18免费网站 | av成人免费| www.久久com | 久草观看视频 | 91在线看免费| 欧美日韩亚洲在线观看 | 亚洲欧美激情插 | 日日爽天天| 国产91九色视频 | 五月婷婷操| 成人午夜电影免费在线观看 | 亚洲成人影音 | 亚洲精品乱码久久久久v最新版 | 五月婷婷色丁香 | 日本h视频在线观看 | 日日夜夜天天干 | 中文字幕av全部资源www中文字幕在线观看 | 久久色视频 | 免费观看国产精品 | 免费一级片在线观看 | 国产色在线,com| 国产精品少妇 | 久久毛片网站 | 亚洲高清网站 | 99超碰在线观看 | 国产精品mv | 日韩伦理片hd | 欧美中文字幕第一页 | 久久永久免费视频 | 国色天香av| 激情影音先锋 | 国产精品二区在线 | 亚洲区二区 | 黄色av免费 | 在线免费性生活片 | 国产精品手机播放 | 国产亚洲精品久久久久秋 | 中文字幕在线观看你懂的 | 狠狠夜夜 | 午夜精品久久久久久久99水蜜桃 | 国产精品福利在线 | 一区二区视频电影在线观看 | 精品国产免费看 | 中国一级特黄毛片大片久久 | 久久国际影院 | 久草在线视频精品 | 久久久免费观看 | 亚洲成a人片77777潘金莲 | 免费视频一二三区 | 黄a在线| 99久久999久久久精玫瑰 | 在线观看免费高清视频大全追剧 | 精品久久久久久久久久久久久久久久久久 | 国产成人精品网站 | 天天色综合久久 | 精品久久视频 | 国产97免费 | 日本最新中文字幕 | 视频在线91 | 免费在线国产黄色 | 成人av一级片 | 日韩精品一区二区三区第95 | 日韩精品aaa| 亚洲国产精品久久 | 五月激情丁香图片 | www色| 欧美日一级片 | 国产在线精品区 | 亚洲精品视频在线观看免费视频 | 国产视频2区 | 午夜av一区 | 午夜精品999 | 91亚洲精品久久久久图片蜜桃 | 欧美日韩一区二区免费在线观看 | 国产精品午夜在线观看 | 人人要人人澡人人爽人人dvd | 在线日韩av| 粉嫩高清一区二区三区 | 成片免费观看视频999 | 在线观看视频精品 | 中文字幕第一 | 六月激情久久 | 日韩中文在线播放 | 97视频网站 | 亚洲一区视频免费观看 | 亚洲视频 中文字幕 | 久久亚洲免费 | 免费精品在线视频 | 丁香婷婷激情国产高清秒播 | 伊人五月在线 | 日韩在线字幕 | 国产精品中文在线 | 99精品视频免费观看视频 | a成人在线| 日韩视频一二三区 | 国内揄拍国产精品 | 欧美日韩一区二区在线观看 | 91人人爽人人爽人人精88v | 国产不卡一区二区视频 | 国产福利精品在线观看 | 国产亚洲一级高清 | 免费色视频网站 | 九九免费在线观看 | 国产高清av免费在线观看 | 色av资源网 | 欧美午夜视频在线 | 91人人网 | 91网站观看 | 91精品视频免费看 | 午夜黄色大片 | 日韩av在线一区二区 | 欧亚日韩精品一区二区在线 | 久久精品综合网 | 久久久久久综合 | 精品久久久久一区二区国产 | 一级片免费观看 | 中文字幕av在线播放 | 中文字幕av在线不卡 | 成人在线一区二区 | www.亚洲精品 | bbb搡bbb爽爽爽| 国产精品一区二区在线观看免费 | a在线免费 | 亚洲欧美国产日韩在线观看 | 91av在线免费 | 美女视频黄,久久 | 午夜久久久久久久 | 亚洲午夜久久久综合37日本 | 久草在线视频网站 | 中文字幕av有码 | 国产九九精品视频 | 国产日韩精品视频 | 超碰97av在线 | 四虎影视精品永久在线观看 | 久久久久久久久亚洲精品 | 国产高清 不卡 | 六月丁香在线观看 | 亚洲三级性片 | 国产精品黄网站在线观看 | 天天天色综合 | 激情深爱 | 国产一级二级三级在线观看 | 国产在线观看91 | 欧美午夜a| 久久婷婷五月综合色丁香 | 97**国产露脸精品国产 | 九九九热精品免费视频观看网站 | 日韩av中文字幕在线 | 国产精品麻豆欧美日韩ww | 欧美成天堂网地址 | 视频一区在线播放 | 亚洲精品一区二区三区新线路 | av观看免费在线 | 黄色大片免费播放 | 成人在线观看日韩 | 亚洲精品视频在线观看网站 | 天天干,天天射,天天操,天天摸 | 国产亚洲欧美一区 | 亚洲欧美国内爽妇网 | 国产在线免费观看 | www亚洲精品 | 亚洲精品成人av在线 | 成人影片在线播放 | 成人免费xyz网站 | 中文字幕有码在线播放 | 欧美日韩性| 亚洲欧洲精品一区二区 | 久草久| www黄com| 国产高清视频在线观看 | 免费日韩一区二区 | 久久福利精品 | 天天天综合网 | 九色福利视频 | 亚洲精品一区二区网址 | 97超碰国产精品女人人人爽 | 婷婷伊人五月天 | 亚洲乱亚洲乱妇 | 国产亚洲精品成人av久久ww | 黄色电影小说 | 成人国产精品免费观看 | 久久韩国免费视频 | 亚洲中字幕 | 国产麻豆视频在线观看 | www看片网站 | 又黄又爽又刺激视频 | 丁香视频在线观看 | 91在线播放视频 | 伊人五月天 | 亚洲精品国产综合99久久夜夜嗨 | 久久婷婷综合激情 | 人人插人人费 | 亚洲欧美日韩国产精品一区午夜 | 免费看黄电影 | 粉嫩av一区二区三区入口 | 国产精品一区二区久久精品爱涩 | 91精品国产九九九久久久亚洲 | 亚洲专区 国产精品 | 久久一本综合 | 日韩午夜电影院 | 国产一区二区播放 | 婷婷av色综合| 欧美了一区在线观看 | 日韩毛片在线播放 | 视频一区二区三区视频 | 日韩特级毛片 | 精品久久久久久久久中文字幕 | 国产中文字幕在线免费观看 | 国产伦理久久 | 五月天久久激情 | 九九热精品在线 | 久久久精品一区二区三区 | 成人av高清| 亚洲精品久久久蜜桃直播 | 91香蕉视频黄 | 成人黄色国产 | 日韩肉感妇bbwbbwbbw | 久久在线电影 | 999国产精品视频 | 久久综合久久综合久久 | 日韩手机在线观看 | 2019中文字幕网站 | 最近中文字幕在线 | 日日夜夜精品免费 | 毛片视频电影 | 在线免费观看国产 | 丁香视频全集免费观看 | 看黄色.com| 欧美伦理电影一区二区 | 色91在线 | 91免费日韩 | 一区二区丝袜 | 三级av免费看 | a天堂最新版中文在线地址 久久99久久精品国产 | 99精品毛片| 亚洲一区日韩在线 | 91精品国产91久久久久 | 日韩视频一区二区在线 | 国产精品私人影院 | 综合久久网 | 91av在线播放| 午夜久久精品 | 99中文视频在线 | 欧美日韩精品在线免费观看 | 九九九热精品 | av亚洲产国偷v产偷v自拍小说 | 成人免费在线电影 | 欧美午夜精品久久久久 | 久久久久久久久久免费 | 免费福利片2019潦草影视午夜 | 天天操天天操 | 在线观看免费福利 | 久草观看 | 欧美日韩另类视频 | 人人草天天草 | 综合国产在线 | 久久久亚洲麻豆日韩精品一区三区 | 成人免费ⅴa | 久久免费视频8 | 四虎在线视频 | 国产原创91 | 日韩欧美成 | 婷婷亚洲五月色综合 | 亚洲h色精品| 久久久精品免费看 | 正在播放国产一区二区 |