C++ 在应用程序中隐藏MySQL凭据
我需要为一家公司创建一个应用程序,他们希望人们登录到该应用程序,以拥有执行不同任务的不同权限 我最初的想法是创建一个MySQL数据库,将凭证硬编码到应用程序中,并让应用程序连接到MySQL数据库。MySQL数据库将有一个名为“users”的表,用于存储用户名、密码和权限。然后应用程序将查询服务器并执行身份验证 最大的问题是将MySQL凭据硬编码到应用程序中。如果应用程序落入坏人之手,如果他们四处窥探以查找凭据并开始删除表,可能会对MySQL数据库造成很大损害 所以我考虑开发一个服务器,作为MySQL数据库的接口。例如,客户端应用程序将通过TCP连接到服务器,服务器连接到MySQL数据库。这样,MySQL凭据永远不会向最终用户公开。然而,这意味着我必须开发一个服务器应用程序,该应用程序a)将更难为我的客户维护和部署(而不仅仅是设置一个MySQL服务器),b)有可能引入更多的错误,因为我需要制作一个额外的系统(这与部署错误修复等的a点有关) 因此,我在想,不是在数据库中有一个用户表,让应用程序使用硬编码凭据直接连接到MySQL服务器,而是给最终用户实际的MySQL用户凭据,让他们进入应用程序连接到MySQL服务器。这意味着,如果有人获得了应用程序,他们不会对MySQL数据库造成任何损害,但仍然存在最终用户将其凭据提供给错误人员的风险C++ 在应用程序中隐藏MySQL凭据,c++,mysql,security,desktop-application,C++,Mysql,Security,Desktop Application,我需要为一家公司创建一个应用程序,他们希望人们登录到该应用程序,以拥有执行不同任务的不同权限 我最初的想法是创建一个MySQL数据库,将凭证硬编码到应用程序中,并让应用程序连接到MySQL数据库。MySQL数据库将有一个名为“users”的表,用于存储用户名、密码和权限。然后应用程序将查询服务器并执行身份验证 最大的问题是将MySQL凭据硬编码到应用程序中。如果应用程序落入坏人之手,如果他们四处窥探以查找凭据并开始删除表,可能会对MySQL数据库造成很大损害 所以我考虑开发一个服务器,作为MyS
让桌面应用程序连接到MySQL数据库的最佳方式是什么?除了我想到的3个解决方案之外,还有其他解决方案吗?或者你对我的解决方案有什么想法吗?正如@Perception所指出的那样。您最好在MySQL前面实现一个web服务。您不希望来自未知IP地址的未知数量的客户端都可以访问您的数据库 通过绑定MySQL连接,DOS攻击您将非常容易。更不用说,您将非常严格地限制扩展后端服务的能力,以满足不断增加的客户群的需求,而不需要在两者之间添加web服务
web服务还可以通过多种方式(用户/通行证组合、基于令牌的访问、OAuth访问等)为您提供控制用户身份验证和授权的能力。在我工作的地方,我看到了两种做法:
- 如果您决定在保留相同信息的同时更改数据库结构,您甚至可能不需要更新客户端应用程序,只需要更新服务
- 凭据永远不会离开服务器,只要没有人访问您的服务器,您的凭据就会保持安全。总体而言,安全性有所提高
- 如果您足够聪明地提供服务,您甚至可以将通常是客户端的大部分内部逻辑转移到服务器上,使更新和错误修复几乎无缝地转移到客户端
- 这是另外一件需要维护的事情
- 您的应用程序容易受到拒绝服务攻击,但由于它是一个数据库,因此可能会出现问题
- 如果服务器宕机,所有的客户端应用程序都会宕机,但还是有问题
- 用户使用用户名和密码登录到其本地应用程序
- 本地应用程序与我们的身份验证服务通信,并获取该用户名和密码的“会话密钥”和共享密钥
- 使用会话密钥(在短时间内到期),应用程序创建一个API密钥(持续很长时间)并将其存储到计算机。如果每次都要求用户登录,则可以使用会话密钥而不是API密钥。我们这样做主要是为了方便一些程序。如果计算机不安全,则应仅使用会话密钥,并且本地计算机上不存储API密钥。用户每次登录时,都会获得一个新的会话密钥
- 对数据库服务的每个请求都附带一个HMAC签名的nonce,应用程序根据API密钥从授权服务获取该nonce。获取nonce后,应用程序使用共享密钥对其进行签名。这些已签名的请求只能使用一次,因为web服务(用户对此一无所知)对请求进行身份验证。一旦签名的nonce已通过服务器端身份验证