SQL 服务器中的加密查询



我想使用删除访问权限在客户端的服务器中执行查询。如果我执行这样的查询Update abc set col1=12 where id = 2他们就会明白我们在做什么。所以我想要一些像这样的加密和解密方法:

在我们的服务器中,我加密了一个这样的查询:

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

所以我得到的输出如下:

0x0100CF465B7B12625EF019E157120D58DD46569AC7BF4118455D12625EF019E157120D58DD46569AC7BF4118455D

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

decrypt(0x0100CF465B7B12625EF019E157120D58DD46569AC7BF4118455D12625EF019E157120D58DD46569AC7BF4118455D)

所以我们的客户无法理解我们执行了什么。

你可以像这样创建一个简单的解密函数。

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然后执行它。

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

select CAST('UPDATE users set name =''alex''' as varbinary(8000))

然后,通过将上述查询的输出作为过程的参数传递,在客户端位置执行 proc exec_decrypt。

Ex:  exec_decrypt 0x55504441544520757365727320736574206E616D65203D27616C657827

希望这对你有用..请注意,客户不应拥有任何权限程序exec_decrypt

我发现确保没有人可以查看您的查询的唯一方法是使用"加密"将它们放在函数或过程中。运行以下代码亲自查看。前面答案中建议的动态 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 解密工具。 即dbForge的数据库解密器。我只是使用它来解密数据库的 T-SQL,因此我可以导出 DACPAC 和 BACPAC 以用于 Azure DevOps 自动化部署。使用加密会导致 DACPAC 和 BACPAC 导出失败。这意味着,如果实现"使用加密",则无法使用DACPAC为数据库修补程序或直接更新创建更新脚本,则无法使用Visual Studio SQL Server Tools项目,从而使数据库开发更加困难。你没有获得任何东西,只是让 Dev 和 Op 更难完成他们的工作。

最新更新