1、base64 編碼
什么是 Base64 編碼? Base64 就是一種基於 64 個可打印字符來表示二進制數據的方法 在 python 中對數據進行 base64 編碼可以使用 base64 這個官方庫
import base64 data= "mike" # base編碼 data = data.encode() res = base64.b64encode(data) print(res) # base64解碼 res2 = base64.b64decode(res) print(res2)
print(res2.decode())
2、常見的哈希算法:
hash算法有很多:比如MD4、MD5、SHA-1 , SHA-224, SHA-256, SHA-384 和 SHA-5等等。其中MD5是比較常見的一種,也稱之為MD5加密。
什么是 MD5 加密?
MD5(Message Digest Algorithm 5),是一種哈希算法,是不可逆的,即通過 md5 加密之后沒辦法得到原文,沒有解密算法。
python 中有一個叫做 hashlib 的官方庫,對於一些常見的哈希算法這個庫都實現了,咱們在工作中如果要使用 MD5 加密,直接使用 hashlib 這個庫就可以實現。
from hashlib import md5 def encrypt_md5(data): """md5加密""" # 創建md5對象 new_md5 = md5() new_md5.update(data.encode('utf-8')) res = new_md5.hexdigest() # 加密 return res
3、DES 加密
什么是對稱加密? 對稱加密指的的加密和解密用同一個秘鑰進行加解密的加密方式。
什么是 EDS 加密? des 對稱加密,是一種比較傳統的加密方式,其加密運算、解密運算使用的是同樣的密鑰,信息的發送者和信息的接收者在進行信息的傳輸與處理時 , 必須共同持相同的密碼。
在 python 中有一個叫做 pyDes 的第三方庫可以用來實現 DES 加密,使用之前需要先通過 pip 命令安裝:pip install pyDes
from pyDes import des, CBC, PAD_PKCS5 import binascii def des_encrypt(s, KEY): secret_key = KEY iv = secret_key k = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5) en = k.encrypt(s, padmode=PAD_PKCS5) return binascii.b2a_hex(en).decode() def des_descrypt(s, KEY): secret_key = KEY iv = secret_key k = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5) de = k.decrypt(binascii.a2b_hex(s), padmode=PAD_PKCS5) return de.decode() if __name__ == '__main__': # 秘鑰 KEY = 'mHAxsLtt' # 加密 res = des_encrypt("python666", KEY) print(res) # 解密 res2 = des_descrypt(res, KEY) print(res2)
4、3DES 加密
什么是 3DES 加密? 3DES(或稱為 Triple DES)是三重數據加密算法(TDEA,Triple Data Encryption Algorithm)塊密碼的通稱。它相當於是對每個數據塊應用三次 DES 加密算法
python 中實現 3DES 加密可以使用,pyDes 這個模塊去實現
import base64 import hashlib import pyDes def encrypt_3des(data): key = "U8NjHq1ZP10=" hash_md5 = hashlib.md5() hash_md5.update(key.encode(encoding='UTF-8')) key = hash_md5.hexdigest() iv = key[0:8] key2 = key[0:24] k = pyDes.triple_des(key2, pyDes.CBC, IV=iv, pad=None, padmode=pyDes.PAD_PKCS5) d = k.encrypt(data.encode()) d = base64.b64encode(d) return d.decode() def descrypt_3des(data): key = "U8NjHq1ZP10=" hash_md5 = hashlib.md5() hash_md5.update(key.encode(encoding='UTF-8')) key = hash_md5.hexdigest() iv = key[0:8] key2 = key[0:24] k = pyDes.triple_des(key2, pyDes.CBC, IV=iv, pad=None, padmode=pyDes.PAD_PKCS5) data = base64.b64decode(data) d = k.decrypt(data) return d.decode() if __name__ == '__main__': res = encrypt_3des('lowen11111') print(res) res2 = descrypt_3des(res) print(res2)
5、AES 加密
什么是 AES 加密? AES 也是一種對稱加密。它是用來替代之前的 DES 的,安全性更高。
關於 python 中實現 Aes 加密的庫很多,大家可以去 pypi 上自行下載安裝,下面案例用的是 Crypto 這個庫
import base64 from Crypto.Cipher import AES class AesEncrypt: # 密鑰 key = '0CoJUm6Qyw8W8jud' # 偏移量 vi = '0102030405060708' def encrypt(self, data): """加密""" data = data.encode('utf8') data = (lambda s: s + (16 - len(s) % 16) * chr(16 - len(s) % 16).encode('utf-8'))(data) cipher = AES.new(self.key.encode('utf8'), AES.MODE_CBC, self.vi.encode('utf8')) encryptedbytes = cipher.encrypt(data) encodestrs = base64.b64encode(encryptedbytes) enctext = encodestrs.decode('utf8') return enctext def decrypt(self, data): """解密""" data = data.encode('utf8') encodebytes = base64.decodebytes(data) cipher = AES.new(self.key.encode('utf8'), AES.MODE_CBC, self.vi.encode('utf8')) text_decrypted = cipher.decrypt(encodebytes) unpad = lambda s: s[0:-s[-1]] text_decrypted = unpad(text_decrypted) text_decrypted = text_decrypted.decode('utf8') return text_decrypted if __name__ == '__main__': # 注意點:加密數據中有中文的時候,會有問題 data = "lowen23" aes = AesEncrypt() # 加密 enctext = aes.encrypt(data) print(enctext) # # 解密 text_decrypted = aes.decrypt(enctext) print(text_decrypted)
6.rsa對稱加密
import base64 from time import time # 需要安裝rsa模塊, pip install rsa import rsa # http://tool.chacuo.net/cryptchacha20 常見的加密算法 class HandleSign: server_pub = """ -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQENQujkLfZfc5Tu9Z1LprzedE O3F7gs+7bzrgPsMl29LX8UoPYvIG8C604CprBQ4FkfnJpnhWu2lvUB0WZyLq6sBr tuPorOc42+gLnFfyhJAwdZB6SqWfDg7bW+jNe5Ki1DtU7z8uF6Gx+blEMGo8Dg+S kKlZFc8Br7SHtbL2tQIDAQAB -----END PUBLIC KEY----- """ @classmethod def encrypt(cls, msg): """ 非對稱加密 :param msg: 待加密字符串或者字節 :return: 密文 """ msg = msg.encode('utf-8') pub_key = cls.server_pub.encode("utf-8") public_key_obj = rsa.PublicKey.load_pkcs1_openssl_pem(pub_key) # 創建 PublicKey 對象 cryto_msg = rsa.encrypt(msg, public_key_obj) # 生成加密文本 cipher_base64 = base64.b64encode(cryto_msg) # 將加密文本轉化為 base64 編碼 return cipher_base64.decode() # 將字節類型的 base64 編碼轉化為字符串類型 @classmethod def generate_sign(cls, token): """ 生成sign :param token: token, 為str類型 :return: 時間戳和sign組成的字典 """ timestamp = int(time()) # 獲取當前的時間戳 prefix_50_token = token[:50] # 獲取token前50位 message = prefix_50_token + str(timestamp) # 將token前50位與時間戳字符串進行拼接 sign = cls.encrypt(message) # 生成sign return {"timestamp": str(timestamp), "sign": sign} if __name__ == '__main__': token = "eyJhbGciOiJIUzUxMiJ9.eyiZXJfaWQiOjI2NSwizdhE5_39bsGlILoSSoTCy0G4FwCnOj4iy5svbDlSbgCJM3qRa1zsXJLJmH4A" cryto_info = HandleSign.generate_sign(token) print(cryto_info)
7.sha1 加密
# SHA1的全稱是Secure Hash Algorithm(安全哈希算法) 。SHA1基於MD5,加密后的數據長度更長, # 它對長度小於264的輸入,產生長度為160bit的散列值。比MD5多32位。 # 因此,比MD5更加安全,但SHA1的運算速度就比MD5要慢了。 import hashlib str = "Hell,python你好" a = hashlib.sha1(str.encode("utf-8")).hexdigest() print("sha1加密前為 :", str) print("sha1加密前后 :", a)
8.hmac
# python中還有一個hmac模塊,它對我們創建key和內容再進行處理然后再加密 # 該模塊加密是先把數據存儲到字典中,然后再進行加密,方法與上述方法類似 import hmac hm = hmac.new('Hell,python你好'.encode(encoding='utf-8')) print(hm.digest()) print(hm.hexdigest())