数据安全性说明 - 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模式

采用该模式的原因有两点

  • 无论任何人如果不知道加密方式,加密密钥,都无法直接通过学生学号调用接口访问数据库,保证了数据的隐私安全性和密码安全性
  • 如果以其他方式获得数据库中信息,其中的信息也经过了加密,如果不知道解密的方式也无法获取明文

因此,我们可以保证用户数据的安全性,在使用我们的软件时不必过多地担心。