如何在多用户使用的Python项目中安全存储MySQL凭证?
解决硬编码数据库凭证的安全方案
结合你的练手银行应用场景,给你几个实用的思路:
1. 重构架构:客户端不直接连接数据库
这是最根本的安全方案,彻底避免客户端接触数据库凭证:
- 搭建一个中间API服务器(用Flask/Django都可以),所有数据库操作都由这个服务器完成
- 客户端exe只负责和API服务器交互(比如发送查询、转账请求),API服务器再去连接数据库执行操作
- 数据库凭证只存在API服务器上,客户端完全碰不到,哪怕exe被反编译也拿不到数据库的权限
示例简化流程:
# 客户端代码(exe里的逻辑) import requests def get_user_balance(user_id): # 只和API服务器通信 resp = requests.get("https://你的API服务器地址/api/balance", params={"user_id": user_id}) return resp.json() # API服务器代码(运行在你的服务器上) from flask import Flask, request import mysql.connector app = Flask(__name__) # 数据库凭证只存在这里,客户端看不到 db_config = { "host": "192.168.1.182", "user": "bank_user", "password": "*mypass*", "port": 3307, "database": "bank" } @app.route("/api/balance") def get_balance(): user_id = request.args.get("user_id") mydb = mysql.connector.connect(**db_config) mycursor = mydb.cursor() mycursor.execute("SELECT balance FROM users WHERE id = %s", (user_id,)) result = mycursor.fetchone() mydb.close() return {"balance": result[0] if result else 0} if __name__ == "__main__": app.run(host="0.0.0.0", port=5000)
2. 凭证混淆+反编译防护(适合练手场景,仅防普通用户)
如果一定要让客户端直接连数据库,只能尽量提高凭证获取的门槛:
- 把凭证拆分成多段,分散在代码的不同位置,运行时再拼接
- 用Cython把包含凭证和解密逻辑的代码编译成
.pyd文件(二进制),再打包成exe,反编译难度比纯Python代码高很多 - 示例混淆逻辑:
# 分散存储的凭证片段 ip_part1 = "192.168" ip_part2 = "1.182" user_part = "bank_" password_part1 = "*my" password_part2 = "pass*" class Server: def __init__(self): self.ip = ip_part1 + "." + ip_part2 self.user = user_part + "user" self.password = password_part1 + password_part2 self.port = 3307 self.database = "bank" # 后续连接逻辑不变...
3. 限制数据库账号权限
给客户端用的数据库账号最小化权限:
- 只授予必要的操作权限,比如
SELECT、INSERT(仅限特定表),绝对不授予UPDATE、DELETE、ALTER等危险权限 - 即使凭证泄露,攻击者也只能做有限的操作,无法修改整个数据库的数据
内容的提问来源于stack exchange,提问作者piotrek
相关产品推荐
相关产品推荐

