[Python3]数据的加密解密

哈希werkzeug.security:

此模块包含了加盐哈希函数方法.

  • generate_password_hash:加密 
  •  check_password_hash: 验证

常见场景:

  • 用于Flask登录验证模块.
from werkzeug.security import generate_password_hash, check_password_hash

#generate_password_hash:哈希加盐
users=[
     {'username': 'Tom', 'password': generate_password_hash('111111')},
     {'username': 'Michael', 'password': generate_password_hash('123456')}
]

print(users)
bools=check_password_hash(users[0]['password'], "111111") #True or False
print(bools)


#输出结果:
"""
[{'username': 'Tom', 'password': 'pbkdf2:sha256:260000$vEXq6oPv5K5FsCFM$cb2a2630a3fba671b1ed2f48a14cbc4073aeba13cc914e79bf4abbc3ea07aadd'}, {'username': 'Michael', 'password': 'pbkdf2:sha256:260000$r5648R87Dx8EOWR2$ad370d27537407dcdfe6d13db4e48bea9c993f1af26e5d07300f3b3f7126ae68'}]

False
"""

AES加密解密:

模块:Crypto.Cipher 、Crypto.Util.Padding

注:window和Linux下载模块不同,且注意加密密钥(KEY)要保密,不要流出

  • window:pip install pycryptodome
  • Linux:pip install pycrypto

常见场景:

  • 用于应用后端与其他项目交互传数据的时候加密解密.
import json
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
import hashlib,base64

#key的长度必须为16位,不然报错
AES_KEY="!@qw#$ert%^y&*u("

class AES_Convert:
    def __init__(self):
        self.key = AES_KEY

    #aes 加密
    def Encryption(self,aes_str):
        # 使用key,选择加密方式
        aes = AES.new(self.key.encode('utf-8'), AES.MODE_ECB)
        pad_pkcs7 = pad(aes_str.encode('utf-8'), AES.block_size, style='pkcs7')  # 选择pkcs7补全
        encrypt_aes = aes.encrypt(pad_pkcs7)
        # 加密结果
        encrypted_text = str(base64.encodebytes(encrypt_aes), encoding='utf-8')  # 解码
        encrypted_text_str = encrypted_text.replace("\n", "")
        return encrypted_text_str


    # aes解码
    def Decryption(self, aes_str):
        aes = AES.new(self.key.encode('utf-8'), AES.MODE_ECB)
        # 优先逆向解密base64成bytes
        base64_decrypted = base64.decodebytes(aes_str.encode(encoding='utf-8-sig'))
        decrypted_text = str(aes.decrypt(base64_decrypted), encoding='utf-8-sig').replace('', '')
        # 注意这里解密会产生乱码,所以加密数据时可以用正则匹配掉乱码,具体问题具体对待
        # 这里传输的是json字符可以用这种方式匹配
        # print(decrypted_text)
        # decrypted_text=re.findall('.*\}',decrypted_text)[0]
        # decrypted_text = re.findall('.*\]', decrypted_text)[0]
        return decrypted_text

if __name__ == '__main__':
    datalist=[
        {"username":"Ton","password":"Ton@.com"},
        {"username":"Michael","password":"Michael@.com"},
    ]
    aes_str=json.dumps(datalist)
    EncryptionData = AES_Convert().Encryption(aes_str)
    DecryptionData = AES_Convert().Decryption(EncryptionData)
    print("加密数据:"+EncryptionData)
    print("加密解密:"+DecryptionData)

#输出:
"""
加密数据:7+S0Fk5WHEZjOqbAYV/x3CpJ0lg6kTJU8RKRc2+CsR8rY/1Q8Mw9DrAAVGx/y0/iYoO/0l9Yb6wUdH11fuEHvZG6S+zQdrTN/flF2qxq383hyNETNW7ZCZXv2bTtEaG4z9noeXj6SgH3lhNTX5hZOw==
加密解密:[{"username": "Ton", "password": "Ton@.com"}, {"username": "Michael", "password": "Michael@.com"}]
"""

JWT加密解密:

python3内置模块:jwt

注:注意加密密钥(KEY)要保密,不要流出

常见场景:

  • 用于应用前后端认证时的token.
import jwt,datetime
SECRECT_KEY="!@qw#$ert%^y&*u("

class Jwt:
    def __init__(self):
        self.SECRECT_KEY = SECRECT_KEY


    # 生成jwt 信息,加密
    def jwtEncoding(self,username=None,id=None, some='xxxx'):
        datetimes=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        option = {
            "time":datetimes,
            "username":username,
            "id":id,
            "some":some
        }
        jwtencode = jwt.encode(option, self.SECRECT_KEY, algorithm='HS256')
        return jwtencode


    # 解密jwt 信息
    def jwtDecoding(self,token):
        try:
            decoded = jwt.decode(token, self.SECRECT_KEY, algorithms=['HS256'])
        except jwt.ExpiredSignatureError:
            decoded = {"error_msg": "is timeout !!", "some": None}
        except Exception:
            decoded = {"error_msg": "noknow exception!!", "some": None}
        return decoded

if __name__ == '__main__':
    jwtencode = Jwt().jwtEncoding(username='admin', id=1)
    print(jwtencode)
    jwtdeode = Jwt().jwtDecoding(jwtencode)
    print(jwtdeode)


#输出
"""
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0aW1lIjoiMjAyMS0wNy0wOSAxOToxMTozMyIsInVzZXJuYW1lIjoiYWRtaW4iLCJpZCI6MSwic29tZSI6Inh4eHgifQ._fwyzwnpeoI5fYBETc-R67T1mzxazMDkPtHvvWAZ4lo
{'time': '2021-07-09 19:11:33', 'username': 'admin', 'id': 1, 'some': 'xxxx'}
"""

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RSA是一种非对称加密算法,用于数据加密解密。在Python3中,可以使用`cryptography`库来实现RSA加密解密。 首先,你需要安装`cryptography`库。可以使用以下命令来安装: ``` pip install cryptography ``` 接下来,我们可以使用以下代码来生成RSA密钥对、进行加密解密操作: ```python from cryptography.hazmat.primitives.asymmetric import rsa, padding from cryptography.hazmat.primitives import serialization # 生成RSA密钥对 private_key = rsa.generate_private_key( public_exponent=65537, key_size=2048 ) public_key = private_key.public_key() # 将密钥保存为PEM格式 private_pem = private_key.private_bytes( encoding=serialization.Encoding.PEM, format=serialization.PrivateFormat.PKCS8, encryption_algorithm=serialization.NoEncryption() ) public_pem = public_key.public_bytes( encoding=serialization.Encoding.PEM, format=serialization.PublicFormat.SubjectPublicKeyInfo ) # 加密 message = b"Hello, World!" ciphertext = public_key.encrypt( message, padding.OAEP( mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None ) ) # 解密 plaintext = private_key.decrypt( ciphertext, padding.OAEP( mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None ) ) # 打印结果 print("加密后的密文:", ciphertext) print("解密后的明文:", plaintext) ``` 这段代码首先生成了一个RSA私钥和对应的公钥,然后使用公钥对消息进行加密,再使用私钥对密文进行解密。最后打印出加密后的密文和解密后的明文。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值