卖兜搞IT

一起学加密(第16期)——AES块加密和HMAC

AES+HMAC的一种应用场景

今天这期算是插播。

给大家看一下我个人在实际工作中使用到的一种加密方法。这个叫Fernet的方法(来自python的cryptography库),它结合了我们前面聊到的块加密AES,和HMAC,具体是怎么实现的,感兴趣的可以参考这篇 https://github.com/fernet/spec/blob/master/Spec.md

直接看代码

import hashlib
import base64

from cryptography.fernet importFernet

defcreate_url_safe_base64_encoded_bytes(secret):
"""convert secret into 32 url-safe base64-encoded bytes for Fernet key"""
# get 32 bytes SHA256 hash
    m = hashlib.sha256()
    m.update(secret.encode())
return base64.urlsafe_b64encode(m.digest())

defencrypt(secret, plain_text):
    f =Fernet(create_url_safe_base64_encoded_bytes(secret))
return f.encrypt(plain_text.encode()).decode()

defdecrypt(secret, cipher):
    f =Fernet(create_url_safe_base64_encoded_bytes(secret))
return f.decrypt(cipher).decode()

if __name__ =="__main__":
    cipher_text = encrypt(secret='password', plain_text="message")
print(cipher_text)

    plain_text = decrypt(secret='password', cipher=cipher_text)
print(plain_text)

结果(第一行是加密后的密文,第二行是解密出来的明文)

gAAAAABh6euHlOnJ7NMXMAU_DLEqyMI6Xcn27a2L3V2kVK5C0o3buhNYzEi-pdOBKgFXQSn0gMMX3dRIKS_74q4frdywlhhfSw==
message

这里我们通过Fernet,然后使用我们自己设置的密码(这里密码是password),去加密一个明文字符串message,通过这种方法可以非常方便的进行字符串加密,或者文件加密。

一个文件加密的例子,注意读取bytes

defencrypt_file(input_file_name, output_file_name, secret):
    f =Fernet(create_url_safe_base64_encoded_bytes(secret))
withopen(input_file_name,'rb')as f_in:
        content_raw = f_in.read()
    encrypted = f.encrypt(content_raw)
withopen(output_file_name,'wb')as f_out:
        f_out.write(encrypted)