一起学加密(第16期)——AES块加密和HMAC
AES+HMAC的一种应用场景
今天这期算是插播。
给大家看一下我个人在实际工作中使用到的一种加密方法。这个叫Fernet的方法(来自python的cryptography库),它结合了我们前面聊到的块加密AES,和HMAC,具体是怎么实现的,感兴趣的可以参考这篇 https://github.com/fernet/spec/blob/master/Spec.md
直接看代码
import hashlib
import base64from 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)