MySQL SecureString作为连接字符串

时间:2013-07-30 00:21:30

标签: c# mysql winforms mysql-connector securestring

我有一个关于SecureString作为MySql-Connector的连接字符串的一般性问题。如果我理解正确,SecureStrings是一种在我的程序中存储字符串的“安全”方式。现在我有两个问题:

  1. 我要在安装时读取密码(TextBox string,因此不安全)
  2. 我要为MySQL-Connector构建一个连接字符串string(再次不安全)
  3. 示例:

    MySqlConnection con = new MySqlConnection();
    MySqlConnectionStringBuilder builder = new MySqlConnectionStringBuilder();
    builder.Add("SERVER", "loaclhost");
    builder.Add("PORT", "3306");
    builder.Add("DATABASE", "test_db");
    builder.Add("UID", "root");
    builder.Add("PASSWORD", "11235813"); //not the real password ;)
    con.ConnectionString = builder.ConnectionString;
    con.Open();
    

    这让我想到了下一个问题:MySQL-Connector API“不安全”,因为所有值都存储为明文string

    最后一个问题:是否有使用SecureString的感觉?

    在我看来,我可以在我的程序中到处使用string。如果涉及到MySQL,那么所有类型的加密(在我的程序中)将毫无用处。

    我对这个观点是对的吗?还有其他方法吗?

    最好的问候 亚历

1 个答案:

答案 0 :(得分:1)

还有其他方法可以做到这一点。这取决于您认为您的连接字符串后面的人以及他们将拥有的访问权限和技能级别。无论你如何试图隐藏它,连接字符串都在那里。

知道连接字符串可能被黑客攻击,我总是认为它会被黑客攻击并在另一端采取预防措施。

我们在数据库服务器端做了好几件事,以确保即使连接字符串被压缩,数据仍然是安全的。

  • 与连接字符串关联的用户在服务器上的权限几乎为零。他们拥有的唯一权限是包含存储过程的SCHEMA上的EXECUTE和CONTROL。
  • 前端唯一的访问权限是通过存储过程。我们绝不允许前端发送SQL字符串。
  • 数据保存在与可执行文件不同的模式中,在DATA模式中,与连接字符串关联的用户具有ZERO权限,他们无法查看,闻到或触摸它。
  • 存储过程将权限委派给具有足够权限来执行proc的无登录用户。 (WITH EXECUTE AS'no-login User')

这是我们所能做的一切。我们还没有找到一种方法来防止连接字符串以某种方式暴露在某处。

回答亚历克斯在下面问的问题。 (评论太长了)

请注意。以下是针对MS SQL Server,它可能适用于其他DBMS系统,但我不能保证其他任何人。

数据库包含Schema,Schema包含数据库对象,例如表,视图,存储过程。 schmea允许您屏蔽数据库对象,例如,如果您有一组允许任何人看到的表,那么他们可以进入COMMON模式,如果您有工资单信息,您需要保护您可以放置进入PAYROLL模式。然后,您可以根据SCHEMA内部对象的类型在SCHEMA上设置不同的安全措施。 Graphicaly看起来像硬盘上的文件夹,在它们下面是它们包含的所有数据库对象。启动服务器时,会自动创建多个架构。你最熟悉的就是DBO schmea。如果您的管理员已将其设置为默认架构,您可能不会意识到这一点。

我们所做的是将所有数据放入DATA schmea中,这意味着只允许表格。因此,如果我们有一个工资单数据库,那么数据表将进入名为dataPayroll的模式。

存储过程是数据库服务器在调用时可以运行的块或SQL代码块。它可以返回数据表或单个值。把它想象成C#中的一种方法。

存储过程具有输入和返回SQL代码中使用的参数。 Paramatarized存储过程是对SQL注入攻击的强有力的防御。

我们的协议表示存储过程和视图都存储在以'prog'开头的模式中。因此,对于工资单数据库,所有非数据的对象都在progPayroll模式中。

由Connection字符串定义的用户只对“prog”架构具有“控制”和“执行”权限。这允许他们调用存储过程。由Connection字符串定义的用户被拒绝所有其他权限。其他地方也拒绝此用户的所有权限。在存储过程中,访问数据的权限委派给NO LOGIN用户,该用户有权使用EXECUTE AS命令从“数据”模式中检索数据。

前端没有sql。所有前端程序员都知道存储过程的名称,参数以及返回类型和值。

这样,即使攻击者设法从程序中取出连接字符串,他们仍然需要做很多工作才能对数据库执行任何操作,因为他们拥有的用户只能执行存储过程

如果您不知道这些内容是什么,那么您真的需要让DB程序员为您设置系统。