MySQL SecureString 作为连接字符串
Posted
技术标签:
【中文标题】MySQL SecureString 作为连接字符串【英文标题】:MySQL SecureString as connection string 【发布时间】:2013-07-29 23:20:07 【问题描述】:我有一个关于将SecureString
作为 mysql-Connector 的连接字符串的一般性问题。如果我理解正确,SecureStrings
是在我的程序中存储字符串的“安全”方式。现在我有两个问题:
-
我必须在安装时读取密码(
TextBox
是 string
,因此不安全)
我要为 MySQL-Connector 建立一个连接字符串 string
(再次不安全)
示例:
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,所有类型的加密(在我的程序中)都将毫无用处。
我的观点正确吗?还有其他方法吗?
最好的问候 亚历克斯
【问题讨论】:
ty,我已经读过这个。这并没有真正解决我的问题。我正在使用 WinForms(我将添加标签),因此没有 PasswordBox,我无法读取密码,因为SecureString
不支持该密码,并且 MySQL-Connector 使用多个 string
s 作为密码、连接字符串和以此类推。
【参考方案1】:
还有其他方法可以做到这一点。这取决于您认为在您的连接字符串之后会出现谁以及他们将拥有什么类型的访问权限和技能级别。无论您如何尝试隐藏,连接字符串都在其中。
知道连接字符串可能被黑客入侵,我总是假设它会被黑客入侵并在另一端采取预防措施。
我们在数据库服务器端做了几件事,以确保即使连接字符串被压缩,数据仍然是安全的。
与连接字符串相关的用户在服务器上的权限几乎为零。他们拥有的唯一权限是对包含存储过程的 SCHEMA 的 EXECUTE 和 CONTROL。 前端的唯一访问权限是通过存储过程。我们绝不允许前端发送 SQL 字符串。 数据保存在与可执行文件不同的架构中,在 DATA 架构中,与连接字符串关联的用户具有零权限,他们无法查看、闻到或触摸它。 存储过程将权限委派给具有足够权限来执行过程的非登录用户。 (以“无登录用户”身份执行)这就是我们所能做的。我们还没有找到防止连接字符串以某种方式暴露在某处的方法。
回答亚历克斯在下面提出的问题。 (评论太长了)
注意。以下是针对 MS SQL Server 的,它可能适用于其他 DBMS 系统,但我不能保证其他任何系统。
A Database 包含 Schema,Schema 包含数据库对象,例如表、视图、存储过程。 schmea 允许您隔离数据库对象,例如,如果您有一组允许任何人查看的表,那么他们可以进入一个 COMMON 模式,如果您有需要保护的工资单信息,您可以放入将其转换为 PAYROLL 模式。然后,您可以根据其中的对象类型在 SCHEMA 上设置不同的安全措施。从图形上看,它们看起来像硬盘驱动器上的文件夹,在它们下面是它们包含的所有数据库对象。当您启动服务器时,会自动创建几个模式。您最熟悉的是 DBO schmea。如果您的管理员已将其设置为您的默认架构,您可能不会意识到这一点。
我们所做的是将所有数据放入 DATA schmea 中,这意味着只允许使用表。因此,如果我们有一个工资单数据库,那么数据表将进入一个名为 dataPayroll 的模式。
存储过程是数据库服务器在被调用时可以运行的一个或多个 SQL 代码块。它可以返回数据表或单个值。将其视为 C# 中的一种方法。
存储过程具有在 SQL 代码中使用的输入和返回参数。参数化存储过程是对 SQL 注入攻击的强大防御。
我们的协议说存储过程和视图都存储在一个以“prog”开头的模式中。因此,在工资单数据库的情况下,所有不是数据的对象都在 progPayroll 模式中。
由连接字符串定义的用户只有对“prog”模式的控制和执行权限。这允许他们调用存储过程。连接字符串定义的用户被拒绝所有其他权限。该用户在其他任何地方也被拒绝所有权限。在存储过程中,访问数据的权限被委派给 NO LOGIN 用户,该用户有权使用 EXECUTE AS 命令从“数据”模式中检索数据。
前端没有sql。前端程序员只知道存储过程的名称、参数以及返回类型和值。
这样,即使攻击者设法从你的程序中挑出连接字符串,他们仍然需要做很多工作才能对你的数据库做任何事情,因为他们拥有的用户只能执行存储的程序。
如果您不知道这些东西是什么,那么您真的需要让数据库程序员为您设置系统。
【讨论】:
能否请您解释两点/词 1:stored procedures
(与??未存储??),2:seperate schema than the execuatables
我不知道他们的立场。
添加到我上面的答案中。以上是关于MySQL SecureString 作为连接字符串的主要内容,如果未能解决你的问题,请参考以下文章
Rfc2898DeriveBytes + PBKDF2 + SecureString 是不是可以使用安全字符串而不是字符串?