时间:2020.09.24
环境:Python3.7
目的:
说明:
作者:Zhong QQ交流群:121160124 欢迎加入!
非对称加密
需要两个密钥来进行加密和解密,这两个秘钥是公开密钥(publickey,简称公钥)和私有密钥(privatekey,简称私钥)。
非对称加密可用于数据的加密和解密 如数据通过加密算法加密后存储在数据库中 取出时通过解密算法获取其原本的值
单向加密
又称为不可逆加密算法,在加密过程中不使用密钥,明文由系统加密处理成密文,密文无法解密。一般适合于验证,在验证过程中,重新输入明文,并经过同样的加密算法处理,得到相同的密文并被系统重新认证。广泛使用于口令加密。
如Django系统内置的加密用户密码使用的make_password(password)方法和check_password(password, db_password)方法,明文密码通过加密算法后不能通过加密后的密码字符串来反向推导出明文密码,只能通过检验方法再次输入明文密码与之前加密的字符串进行验证来判断密码准确性。
DES加密
DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。需要注意的是,在某些文献中,作为算法的DES称为数据加密算法(Data Encryption Algorithm,DEA),已与作为标准的DES区分开来。 —— 百度百科
应用场景
利用密钥加密数据 可逆向
OpenSSL
Linux系统自带的工具(协议) 可以用来加密
加密一个文件 hello.txt
openssl enc -des -e -a -in hello.txt -out hello.des
解密文件
openssl enc -des -d -a -in hello.des -out hello.txt
常用参数说明:
- enc 表明你打算使用某个算法
- -des 是具体使用的某个算法
- -e 表明要加密
- -d 表明要进行解密
- -a 使用ASCII进行编码
- -base64 使用base64进行编码
- -in 要加密的文件名字
- -out 加密后的文件名字
- -k 指定加密密码
- -kfile 指定密钥文件加密
secrets
Python标准库secrets 可以生成用于处理敏感信息如密码、用户身份认证、口令等信息的强加密随机数 在Python程序中可以用来加密字符串,也可以加密整个文本信息!
加密字符串示例
from secrets import token_bytes
# 生成随机密钥
def random_key(length):
key = token_bytes(nbytes=length)
key_int = int.from_bytes(key, 'big')
return key_int
# 加密方法
def encrypt(text):
raw_bytes = text.encode()
raw_int = int.from_bytes(raw_bytes, 'big')
key_int = random_key(len(raw_bytes))
return raw_int ^ key_int, key_int
# 解密方法
def decrypt(encrypted, key_int):
decrypted = encrypted ^ key_int
length = (decrypted.bit_length() + 7) // 8
decrypted_bytes = int.to_bytes(decrypted, length, 'big')
return decrypted_bytes.decode()
string = "Hi 熊猫!!!"
# 调用加密方法加密字符串
sec_string = encrypt(string)
print(sec_string) # (25866024660680386519929928980, 8659531533290286345891224629)
# 调用解密方法解密上面加密的字符串
source_string = decrypt(*sec_string)
print(source_string) # Hi 熊猫!!!
上面简单的示例 通过调用加密方法加密一句话 返回的是一个由数值组成的元祖 其实是相当于把密钥和加密后的数据都放在一起了 有需要的可以拆开存储 更利于安全 如把密钥放置于本地而不是程序代码中 下面用同样的原理加密一个TXT文本
加密TXT文本文件示例
from secrets import token_bytes
# 生成(加强的)随机数
def random_key(length):
key = token_bytes(nbytes=length)
key_int = int.from_bytes(key, 'big')
return key_int
# 加密方法
def encrypt(text):
raw_bytes = text.encode()
raw_int = int.from_bytes(raw_bytes, 'big')
key_int = random_key(len(raw_bytes))
return raw_int ^ key_int, key_int
# 解密方法
def decrypt(encrypted, key_int):
decrypted = encrypted ^ key_int
length = (decrypted.bit_length() + 7) // 8
decrypted_bytes = int.to_bytes(decrypted, length, 'big')
return decrypted_bytes.decode()
# 加密test.txt 先读取原数据然后做加密
with open('test.txt', 'r', encoding='utf8') as fr:
text = fr.read()
sec_text = encrypt(text)
# 再写入加密后的数据
with open('test.txt', 'w', encoding='utf8') as fw:
fw.write(str(sec_text))
# 解密test.txt 先读取加密后的数据然后做解密
with open('test.txt', 'r', encoding='utf8') as fr:
txt = fr.read()
source_text = decrypt(*tuple(eval(txt)))
# 再写入解密后的数据
with open('test.txt', 'w', encoding='utf8') as fw:
fw.write(source_text)
以上对 secrets 模块的使用方法有部分参考与网络其它文章 具体出处不详 一搜一大堆
微信公众号