我想使用删除访问在客户端的服务器中执行查询。如果我执行类似Update abc set col1=12 where id = 2
的查询,他们就会明白我们在做什么。所以我想要一些加密和解密方法,如下所示:
在我们的服务器中,我加密了这样的查询:
encrypt(Update abc set col1=12 where id = 2)
所以我输出如下:
0x0100CF465B7B12625EF019E157120D58DD46569AC7BF4118455D12625EF019E157120D58DD46569AC7BF4118455D
我在客户端的计算机上执行这个加密查询,如下所示:
decrypt(0x0100CF465B7B12625EF019E157120D58DD46569AC7BF4118455D12625EF019E157120D58DD46569AC7BF4118455D)
所以我们的客户无法理解我们已经执行了什么。
答案 0 :(得分:1)
你可以像这样创建一个简单的解密函数。
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,然后执行它..
您可以使用下面的来生成加密查询
select CAST('UPDATE users set name =''alex''' as varbinary(8000))
然后通过传递上述查询的输出作为过程的参数,在客户端执行proc exec_decrypt。
Ex: exec_decrypt 0x55504441544520757365727320736574206E616D65203D27616C657827
希望这对您有用..请注意,客户不应该获得任何许可 proc exec_decrypt
答案 1 :(得分:0)
我发现确保没有人可以查看您的查询的唯一方法是使用“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')
我发现让别人捕获你的功能和程序的唯一方法是在没有人访问的服务器上的自己的数据库中创建它们。然后,将数据库的副本附加到您需要它们的服务器上。
答案 2 :(得分:0)
我认为,使用加密通常会适得其反,因为有许多Sql Server解密工具。即dbForge的数据库解密器。我只是用它来解密数据库的T-SQL,所以我可以导出DACPAC和BACPAC以便在Azure DevOps自动化部署中使用。 使用加密会导致DACPAC和BACPAC导出失败。这意味着,如果实现使用加密,则不能使用DACPAC为数据库修补程序创建更新脚本或直接更新,也就无法使用Visual Studio Sql Server Tools项目,这会使数据库开发更加困难。您还没有获得任何保证,只是让开发人员和运营人员难以完成他们的工作。