1

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

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

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

所以我得到如下输出:

0x0100CF465B7B12625EF019E157120D58DD46569AC7BF4118455D12625EF019E157120D58DD46569AC7BF4118455D

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

decrypt(0x0100CF465B7B12625EF019E157120D58DD46569AC7BF4118455D12625EF019E157120D58DD46569AC7BF4118455D)

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

4

3 回答 3

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

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

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

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

Ex:  exec_decrypt 0x55504441544520757365727320736574206E616D65203D27616C657827

希望这对你有用.. 请注意,客户端不应该对 proc exec_decrypt 有任何权限

于 2012-07-04T09:21:32.120 回答
0

我发现确保没有人可以查看您的查询的唯一方法是将它们放入使用“加密”的函数或过程中。运行下面的代码自己看看。较早答案中建议的动态 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')

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

于 2018-03-26T17:16:54.287 回答
0

在我看来,With Encryption通常会适得其反,因为有许多 Sql Server 解密工具。即dbForge 的DB Decryptor。我只是用它来解密数据库的 T-SQL,所以我可以导出 DACPAC 和 BACPAC 用于 Azure DevOps 自动化部署。使用加密会导致 DACPAC 和 BACPAC 导出失败。这意味着,如果您实施With Encryption,则无法使用 DACPAC 为 DB Patches 或直接更新创建更新脚本,您将无法使用 Visual Studio Sql Server Tools 项目,这使得 DB 开发更加困难。你没有获得任何东西,只是让 Dev 和 Op 更难完成他们的工作。

于 2019-09-11T15:09:01.490 回答