数据安全性说明 - SE2020-TopUnderstanding/BUAA-Campus-Tools-Backend GitHub Wiki
本文通过AES对学生密码和学号进行加密
代码如下
class Aescrypt():
"""
加密和解密方法
支持ECB和CBC两种模式
"""
def __init__(self, key, model, iv_, encode_):
self.encode_ = encode_
self.model = {'ECB': AES.MODE_ECB, 'CBC': AES.MODE_CBC}[model]
self.key = key
self.iv_ = self.add_16(iv_)
if model == 'ECB':
self.aes = AES.new(self.key, self.model) # 创建一个aes对象
elif model == 'CBC':
self.aes = AES.new(self.key, self.model, self.iv_) # 创建一个aes对象
# 这里的密钥长度必须是16、24或32,目前16位的就够用了
def add_16(self, par):
"""
par代表加密的文本,文本长度需要补全到16的倍数
且将文本编码
"""
par = par.encode(self.encode_) # 编码
length = len(par) % 16
if length == 0:
i = 0
while i < 16:
i = i + 1
par += b'\x10'
else:
length = 16 - length
length = chr(length).encode(self.encode_)
while len(par) % 16 != 0:
par += length
return par
def aesencrypt(self, text):
text = self.add_16(text)
encrypt_text = self.aes.encrypt(text)
return base64.encodebytes(encrypt_text).decode().strip() # 先按照base64编码再解码
def aesdecrypt(self, text):
if self.model == AES.MODE_CBC:
self.aes = AES.new(self.key, self.model, self.iv_)
text = base64.decodebytes(text.encode(self.encode_)) # 先编码再按照base64解码
decrypt_text = self.aes.decrypt(text)
t_all = decrypt_text.decode(self.encode_).strip('\0')
t_list = list(t_all)
length = len(t_list)
surplus = ord(t_list[length - 1])
return t_all[0:length - surplus] # 得出解密后的密码再解码
目前本项目为了与前端进行有效的加密解密,采用的AES中的ECB模式
采用该模式的原因有两点
- 无论任何人如果不知道加密方式,加密密钥,都无法直接通过学生学号调用接口访问数据库,保证了数据的隐私安全性和密码安全性
- 如果以其他方式获得数据库中信息,其中的信息也经过了加密,如果不知道解密的方式也无法获取明文
因此,我们可以保证用户数据的安全性,在使用我们的软件时不必过多地担心。