我希望我的 sqlite 数据库中的一列被加密,但对我的 Flask 应用程序仍然可见。当我使用下面的解决方案时 - 我的 Flask 应用程序能够看到加密列中的数据,但是当我打开数据库时,我看到数据已加密。
但我不确定我的解决方案是否可以安全地在 pythonanywhere.com 上公开托管。我面临的弱点是什么?将我的“密钥”保存在代码中安全吗?这是我的代码如下:
from flask import Flask
from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required
from sqlalchemy_utils import EncryptedType
key = "my_encryption_key_here"
app = Flask(__name__)
app.config['SECRET_KEY'] = 'hello'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///db.sqlite'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
login_manager = LoginManager()
login_manager.init_app(app)
class Rx(db.Model):
id = db.Column(db.Integer, primary_key=True)
sx_string = db.Column(EncryptedType(db.String, key), nullable=True, unique=False)
我建议将其放入一个单独的文件中,该文件在您的
.gitignore
文件中被明确忽略,然后从那里导入它。或者,您可以使用包含可以加载的环境变量的 .env
文件(PythonAnywhere 网站上有一个帮助页面解释了如何执行此操作,只需在首页搜索“环境”即可。
原因是,如果它与代码的其余部分混合在一起,如果您将代码存储在 GitHub 或类似内容上的 git 存储库中,那么您的加密密钥将位于该服务上 - 因此,如果发生违反该服务,或者如果您不小心将存储库公开或类似的事情,您的密钥将被泄露。