将私人信息安全地存储在数据库中

时间:2019-07-03 10:30:39

标签: email security flask passwords

我正在构建一个小型Web应用程序,该应用程序必须能够发送一些邮件。因为用户应该提供他们的邮件凭据,所以我需要一种安全的方式来存储他们的信息。

我正在使用Flask-Mail扩展名,该扩展名似乎总是通过env vars配置的。这不适合我的用例。我也不想以明文形式存储用户的邮件密码。那么如何正确存储数据?

更新:

我想出了以下代码,并希望是否有任何可以改进的地方:

我知道每个Flask应用程序都有一个唯一的密钥,该密钥不会更改,实际上在整个Framework及其扩展中都用于不同种类的加密。因此,我决定也使用它来存储加密的密码。

由于加密和解密需要一些时间,因此我决定在启动时将数据加载到内存中(在应用程序实例化后可以使用密钥后更新配置)。

class Preferences(db.Model):
    """ Store User Preferences here"""
    __tablename__ = 'preferences'
    id = db.Column(db.Integer, primary_key=True)
    # some normal settings
    # Mail Account Data
    mail_username = db.Column(db.String(128))
    mail_password_encrypted = db.Column(db.LargeBinary)

    @property
    def mail_password(self):
        raise AttributeError('password is not a readable attribute')

    def encrypt_mail_password(self, password):
        """
        Accepts the clear text password and stores it encrypted with the app´s secret key.

        :param password: clear text password
        :return:
        """
        secret_key = current_app.config['SECRET_KEY']
        cryptor = rncryptor.RNCryptor()
        encrypted_password = cryptor.encrypt(password, secret_key)
        self.mail_password_encrypted = encrypted_password
        db.session.commit()

    def decrypt_mail_password(self):
        """
        Decrypts the encrypted password with the app´s secret key.
        :return: decrypted password
        """
        secret_key = current_app.config['SECRET_KEY']
        cryptor = rncryptor.RNCryptor()
        decrypted_password = cryptor.decrypt(self.mail_password_encrypted, secret_key)
        return decrypted_password

问候

0 个答案:

没有答案