C++ 在应用程序中隐藏MySQL凭据

C++ 在应用程序中隐藏MySQL凭据,c++,mysql,security,desktop-application,C++,Mysql,Security,Desktop Application,我需要为一家公司创建一个应用程序,他们希望人们登录到该应用程序,以拥有执行不同任务的不同权限 我最初的想法是创建一个MySQL数据库,将凭证硬编码到应用程序中,并让应用程序连接到MySQL数据库。MySQL数据库将有一个名为“users”的表,用于存储用户名、密码和权限。然后应用程序将查询服务器并执行身份验证 最大的问题是将MySQL凭据硬编码到应用程序中。如果应用程序落入坏人之手,如果他们四处窥探以查找凭据并开始删除表,可能会对MySQL数据库造成很大损害 所以我考虑开发一个服务器,作为MyS

我需要为一家公司创建一个应用程序,他们希望人们登录到该应用程序,以拥有执行不同任务的不同权限

我最初的想法是创建一个MySQL数据库,将凭证硬编码到应用程序中,并让应用程序连接到MySQL数据库。MySQL数据库将有一个名为“users”的表,用于存储用户名、密码和权限。然后应用程序将查询服务器并执行身份验证

最大的问题是将MySQL凭据硬编码到应用程序中。如果应用程序落入坏人之手,如果他们四处窥探以查找凭据并开始删除表,可能会对MySQL数据库造成很大损害

所以我考虑开发一个服务器,作为MySQL数据库的接口。例如,客户端应用程序将通过TCP连接到服务器,服务器连接到MySQL数据库。这样,MySQL凭据永远不会向最终用户公开。然而,这意味着我必须开发一个服务器应用程序,该应用程序a)将更难为我的客户维护和部署(而不仅仅是设置一个MySQL服务器),b)有可能引入更多的错误,因为我需要制作一个额外的系统(这与部署错误修复等的a点有关)

因此,我在想,不是在数据库中有一个用户表,让应用程序使用硬编码凭据直接连接到MySQL服务器,而是给最终用户实际的MySQL用户凭据,让他们进入应用程序连接到MySQL服务器。这意味着,如果有人获得了应用程序,他们不会对MySQL数据库造成任何损害,但仍然存在最终用户将其凭据提供给错误人员的风险


让桌面应用程序连接到MySQL数据库的最佳方式是什么?除了我想到的3个解决方案之外,还有其他解决方案吗?或者你对我的解决方案有什么想法吗?

正如@Perception所指出的那样。您最好在MySQL前面实现一个web服务。您不希望来自未知IP地址的未知数量的客户端都可以访问您的数据库

通过绑定MySQL连接,DOS攻击您将非常容易。更不用说,您将非常严格地限制扩展后端服务的能力,以满足不断增加的客户群的需求,而不需要在两者之间添加web服务


web服务还可以通过多种方式(用户/通行证组合、基于令牌的访问、OAuth访问等)为您提供控制用户身份验证和授权的能力。

在我工作的地方,我看到了两种做法:

  • 访问数据库的每个实体(个人、事物或业务(取决于所需的粒度级别)都有自己的凭据。这被用于MSSQL和火箭宇宙数据库。这主要是零售和遗留软件

  • 我们自己托管应用程序,并为用户使用单独的身份验证系统。数据库凭据存储在托管应用程序的服务器上。客户端对备份数据库一无所知。这些通常是web应用程序和web服务

  • 我们可以做的一件事是,我们的许多应用程序实际上通过一个RESTful服务进行通信,该服务以某种方式模拟数据库。应用程序本身无法访问数据库。我会阅读维基百科关于restful服务的文章以了解更多信息。我们的身份验证是使用Nonce编码的HMAC请求来完成的,在该请求中,每个用户都被赋予与他们的凭据相关的自己的密钥

    将数据库包装到web服务中会给您带来一些可能的优势:

    • 如果您决定在保留相同信息的同时更改数据库结构,您甚至可能不需要更新客户端应用程序,只需要更新服务
    • 凭据永远不会离开服务器,只要没有人访问您的服务器,您的凭据就会保持安全。总体而言,安全性有所提高
    • 如果您足够聪明地提供服务,您甚至可以将通常是客户端的大部分内部逻辑转移到服务器上,使更新和错误修复几乎无缝地转移到客户端
    我看到的缺点是:

    • 这是另外一件需要维护的事情
    • 您的应用程序容易受到拒绝服务攻击,但由于它是一个数据库,因此可能会出现问题
    • 如果服务器宕机,所有的客户端应用程序都会宕机,但还是有问题
    RESTful体系结构:

    HMAC:

    我们的HMAC系统工作原理如下:

    • 用户使用用户名和密码登录到其本地应用程序
    • 本地应用程序与我们的身份验证服务通信,并获取该用户名和密码的“会话密钥”和共享密钥
    • 使用会话密钥(在短时间内到期),应用程序创建一个API密钥(持续很长时间)并将其存储到计算机。如果每次都要求用户登录,则可以使用会话密钥而不是API密钥。我们这样做主要是为了方便一些程序。如果计算机不安全,则应仅使用会话密钥,并且本地计算机上不存储API密钥。用户每次登录时,都会获得一个新的会话密钥
    • 对数据库服务的每个请求都附带一个HMAC签名的nonce,应用程序根据API密钥从授权服务获取该nonce。获取nonce后,应用程序使用共享密钥对其进行签名。这些已签名的请求只能使用一次,因为web服务(用户对此一无所知)对请求进行身份验证。一旦签名的nonce已通过服务器端身份验证