我正在构建一个小型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
问候