在数据库中查询加密的值

11 浏览
0 Comments

在数据库中查询加密的值

我有一个使用SQL Server 2008的ASP.NET Web应用程序。

当通过Web应用程序提交邮政编码时,它会被加密,然后加密的值会被发送到数据库并插入到表中。

现在我需要找到一种方法,通过在Web应用程序中搜索邮政编码的部分来查询这些邮政编码,例如:

SELECT PostCode
FROM Table
WHERE PostCode LIKE @PostCode + '%'

我如何在不在数据库中存储解密函数的情况下实现这一点?(我认为这对安全性不利?)

0
0 Comments

数据库中加密值的查询出现的原因是为了保护数据的安全性,但同时也给数据的搜索和查询带来了困扰。解决这个问题的方法有两种选择:

1. 将要提交的数据进行加密,这样将比较两个不同的加密值。但是,如果使用了盐,这种方法将失败。

2. 在存储之前不对值进行加密,而是正常保存。如果确实需要加密,可以使用SQL Server中提供的加密方法自动加密列。

加密的目的主要是保护数据“在休息时”的安全性,而SQL Server可以自己完成这一点。

不要对这种方式进行加密吗?

如果您希望对其进行搜索,则通常不应该对字段(如密码)进行加密,而应使用盐进行单向哈希处理。对于需要进行大规模搜索的字段,应使用可逆加密或更好的是存储容器(在这种情况下是SQL Server)的加密机制进行处理。

如果只有一个应用程序在检索信息之前才解密字段,并且只有一个应用程序解密字段,那么您可以依赖应用程序的加密密钥。然而,我认为这是一种脆弱的方法。由于不同服务器的暴露方式不同,数据库服务器中的密钥比网页服务器上的密钥稍微更安全。换句话说,Web服务器可以通过互联网直接访问,而数据库服务器不应该这样。

我以为我是在正确的方向上进行操作,但是似乎我完全错了!所以我应该集中关注数据库安全性,而不是过多担心单个数据的安全性吗?我担心的是,如果开发团队被授予对数据库的访问权限,他们将可以访问所有这些存储的信息。

已授予访问该加密密钥的用户帐户将能够解密数据。这与让开发人员访问存放该密钥的生产Web服务器没有任何区别。一般来说,开发人员不应该访问生产数据,特别是在需要加密数据的情况下。相反,您应该有专门的运维人员来访问,并且这些人员已经经过适当的背景调查。如果开发人员需要复制问题,您的运维人员可以与他们合作设置。

安全性不仅仅是技术,还涉及到人员。当您了解到大多数数据丢失是内部人员造成的时,您可以开始对他们进行适当的防范。不要相信除了那些绝对必要的人之外的任何人,并持续对他们进行验证。附带一提:在我从事这个行业的20多年里,我从未遇到过只能使用生产数据进行调试的情况。虽然这样做更容易,但并非必需。

感谢您的帮助,克里斯,我认为您说得对,生产数据库不应该由开发人员直接访问。对于您回答中的第2点,如果有人可以访问数据库,加密列是否不是浪费?他们不是可以自己解密吗?

只有在用户帐户具有访问密钥的权限时,该用户账户才能解密数据。请阅读以下内容:sqlsafety.blogspot.com/2010/10/…

0
0 Comments

查询加密值的原因是为了保护敏感数据在数据库中的安全性。通过加密数据,可以确保即使数据库被攻击或泄漏,敏感信息也不会被轻易获取。

然而,由于数据被加密,直接在数据库中进行查询变得困难。传统的SQL查询语句无法对加密数据进行准确匹配,因为加密后的值是不可读的。

解决这个问题的第一种方法是在ASP.Net应用程序中发送加密的邮政编码到数据库,并使用类似下面的查询语句进行查询:

SELECT PostCode
FROM Table
WHERE PostCode LIKE  + '%'

然而,这种方法可能无法正常工作。

解决这个问题的第二种方法是使用加密列查询的方法。可以参考以下文章:Encrypted Columns and SQL Server Performance。这篇文章提供了关于如何查询加密列的指导。

这些方法可以在C# ASP.net和SQL Server中使用,可以通过在代码中进行实际测试来验证方法的有效性。

0
0 Comments

查询数据库中加密的值的问题出现的原因是,用户在将查询字符串发送到数据库时,数据库会将其加密存储,导致无法直接使用原始的查询字符串进行搜索。

解决方法是在网络应用程序中对搜索字符串进行加密,并将加密后的字符串与数据库中的加密版本进行比较。这样就可以实现使用加密后的字符串进行查询。

以下是一个可能的解决方案的示例代码:

// 在网络应用程序中加密搜索字符串

string searchQuery = "Court";

string encryptedSearchQuery = Encrypt(searchQuery);

// 在数据库中执行查询

string sqlQuery = "SELECT * FROM table WHERE encrypted_column = @searchQuery";

SqlCommand command = new SqlCommand(sqlQuery, connection);

command.Parameters.AddWithValue("@searchQuery", encryptedSearchQuery);

通过这种方法,我们可以在数据库中查询加密过的值,而不需要直接使用原始的搜索字符串。这样可以保护数据的安全性,并确保只有经过授权的用户可以访问加密的数据。

0