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