Надежно хранить личную информацию в базе данных - PullRequest
0 голосов
/ 03 июля 2019

Я создаю небольшое веб-приложение, которое должно иметь возможность отправлять некоторые письма.Поскольку пользователи должны предоставить свои почтовые учетные данные, мне нужен безопасный способ хранения их информации.

Я использую расширение 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

Привет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...