sqlserver中的加密查询

sqlserver中的加密查询,sql,sql-server,encryption,Sql,Sql Server,Encryption,我想使用remove access在客户机的服务器上执行查询。如果我执行这样的查询updateabcsetcol1=12,其中id=2,他们就会理解我们在做什么。所以我想要一些加密和解密的方法如下: encrypt(Update abc set col1=12 where id = 2) 在我们的服务器中,我加密如下查询: encrypt(Update abc set col1=12 where id = 2) 所以我得到如下输出: 0x0100CF465B7B12625EF019E1571

我想使用remove access在客户机的服务器上执行查询。如果我执行这样的查询
updateabcsetcol1=12,其中id=2
,他们就会理解我们在做什么。所以我想要一些加密和解密的方法如下:

encrypt(Update abc set col1=12 where id = 2)
在我们的服务器中,我加密如下查询:

encrypt(Update abc set col1=12 where id = 2)
所以我得到如下输出:

0x0100CF465B7B12625EF019E157120D58DD46569AC7BF411855D12625EF019E157120D58DD46569AC7BF411845D

我在客户机上执行加密查询,如下所示:

encrypt(Update abc set col1=12 where id = 2)

解密(0x0100CF465B7B12625EF019E157120D58DD46569AC7BF418455D12625EF019E157120D58DD46569AC7BF418455D)


因此,我们的客户无法理解我们执行了什么。

您可以创建一个简单的解密函数,如下所示

create proc exec_decrypt(@sql_str varbinary(8000))
as
begin
declare @qry varchar(8000);
select @qry=cast(@sql_str as varchar(8000));
exec(@qry);
end
它接受varbinary字符串并转换为varchar,然后执行它

您可以使用下面的sament生成加密查询

select CAST('UPDATE users set name =''alex''' as varbinary(8000))
然后通过将上述查询的输出作为过程的参数,在客户端执行proc exec_decrypt

Ex:  exec_decrypt 0x55504441544520757365727320736574206E616D65203D27616C657827

希望这对你有用。。请注意,客户端不应该对
proc exec_decrypt

您可以创建这样一个简单的解密函数

create proc exec_decrypt(@sql_str varbinary(8000))
as
begin
declare @qry varchar(8000);
select @qry=cast(@sql_str as varchar(8000));
exec(@qry);
end
它接受varbinary字符串并转换为varchar,然后执行它

您可以使用下面的sament生成加密查询

select CAST('UPDATE users set name =''alex''' as varbinary(8000))
然后通过将上述查询的输出作为过程的参数,在客户端执行proc exec_decrypt

Ex:  exec_decrypt 0x55504441544520757365727320736574206E616D65203D27616C657827

希望这对你有用。。请注意,客户端不应该对
proc exec_decrypt

我发现确保没有人可以查看您的查询的唯一方法是使用“with encryption”将它们放入函数或过程中。运行下面的代码,亲自查看。前面的答案中建议的动态SQL并不能完全解决您的问题

create procedure dbo.dummy_drop_me with encryption as select t.* from sys.dm_exec_requests r cross apply sys.dm_exec_sql_text (r.sql_handle) t where r.session_id = @@spid
go
exec dbo.dummy_drop_me
go
select t.* from sys.dm_exec_requests r cross apply sys.dm_exec_sql_text (r.sql_handle) t where r.session_id = @@spid
go
exec ('select t.* from sys.dm_exec_requests r cross apply sys.dm_exec_sql_text (r.sql_handle) t where r.session_id = @@spid')

我发现防止别人捕获您的函数和过程的唯一方法是在无人访问的服务器上的自己的数据库中创建它们。然后,将数据库的副本附加到您需要的服务器上。

我发现确保没有人可以查看您的查询的唯一方法是使用“带加密”将它们放入函数或过程中。运行下面的代码,亲自查看。前面的答案中建议的动态SQL并不能完全解决您的问题

create procedure dbo.dummy_drop_me with encryption as select t.* from sys.dm_exec_requests r cross apply sys.dm_exec_sql_text (r.sql_handle) t where r.session_id = @@spid
go
exec dbo.dummy_drop_me
go
select t.* from sys.dm_exec_requests r cross apply sys.dm_exec_sql_text (r.sql_handle) t where r.session_id = @@spid
go
exec ('select t.* from sys.dm_exec_requests r cross apply sys.dm_exec_sql_text (r.sql_handle) t where r.session_id = @@spid')


我发现防止别人捕获您的函数和过程的唯一方法是在无人访问的服务器上的自己的数据库中创建它们。然后,将数据库副本附加到需要的服务器上。

在我看来,使用加密的通常会适得其反,因为有许多Sql Server解密工具。ie dbForge的DB解密程序。我只是用它来解密数据库的T-SQL,所以我可以导出DACPAC和BACPAC,以便在Azure DevOps自动化部署中使用加密导致DACPAC和BACPAC导出失败。这意味着,如果使用加密实现则不能使用DACPAC为DB修补程序或直接更新创建更新脚本,也不能使用Visual Studio Sql Server工具项目,这使得DB开发更加困难。您没有获得任何安全保护,只是使开发人员和Op人员的工作更加困难。

在我看来,使用加密通常会适得其反,因为有许多Sql Server解密工具。ie dbForge的DB解密程序。我只是用它来解密数据库的T-SQL,所以我可以导出DACPAC和BACPAC,以便在Azure DevOps自动化部署中使用加密导致DACPAC和BACPAC导出失败。这意味着,如果使用加密实现则不能使用DACPAC为DB修补程序或直接更新创建更新脚本,也不能使用Visual Studio Sql Server工具项目,这使得DB开发更加困难。你没有保护任何东西,只是让开发人员和操作人员更难完成他们的工作。

有趣的想法,但问题是什么?多么奇怪的要求,你的客户对数据库的访问级别是什么,你的访问级别是什么?如果你是远程运行,他们怎么知道你在做什么,如果他们正在使用SQL事件探查器运行和监视,这不会混淆任何内容。这只会让你看起来很阴暗。怎样才能阻止他们使用
解密
功能?@ypercube当然这是合法的。他们是技术人员。如果他们看到我们的查询,他们可以捕获它并自己再次执行它。那么,我们为什么要向他们展示我们的查询呢?这是一个有趣的想法,但问题是什么?多么奇怪的要求,您的客户端对数据库的访问级别是什么,您的访问级别是什么?如果您是远程运行的,如果他们使用SQL Profiler运行和监视,他们如何知道您在做什么,这不会混淆任何东西。这只会让你看起来很阴暗。怎样才能阻止他们使用
解密
功能?@ypercube当然这是合法的。他们是技术人员。如果他们看到我们的查询,他们可以捕获它并自己再次执行它。那么我们为什么要向他们展示我们的查询呢?“请注意,客户端不应该对proc exec_decrypt拥有任何权限”。更不用说堆栈溢出;-)@joe G Joseph你展示的程序很好。但是我们不能增加varbinary的长度吗?如果需要,可以使用varbinary(MAX)。varbinary(8000)对于普通查询来说已经足够了使用varbinary(MAX)而不仅仅是varbinary,因为如果我们不指定长度,它只需要30个字符。我现在将更改原始脚本..这是混淆而不是加密。这是SQL注入攻击中使用的一种非常著名的技术。e、 g.见。但是,如果客户端不知道,可能会起作用。“请注意,客户端不应该对proc exec_decrypt拥有任何权限”。更不用说