我的公司认为我们编写的数据库脚本是我们知识产权的一部分。
在新版本中,我们为用户提供了两部分设置:
- 桌面应用程序
- 一个包含初始化/更新数据库的复杂性的可执行文件(RedGate SQL Packager)。
我知道一旦脚本存在,我可以加密数据库上的存储过程,但是有没有办法以加密形式插入它?我不希望纯文本能够通过“线路”(或更准确地说,在 SQL 脚本可执行文件和服务器之间)被截获。
我并没有真正依赖于我们正在使用的工具——我只是想知道它是否可能,而不必求助于一些做作的东西。
我的公司认为我们编写的数据库脚本是我们知识产权的一部分。
在新版本中,我们为用户提供了两部分设置:
我知道一旦脚本存在,我可以加密数据库上的存储过程,但是有没有办法以加密形式插入它?我不希望纯文本能够通过“线路”(或更准确地说,在 SQL 脚本可执行文件和服务器之间)被截获。
我并没有真正依赖于我们正在使用的工具——我只是想知道它是否可能,而不必求助于一些做作的东西。
尝试使用Enctyptpassphrase和DecryptPassPharse函数。
使用 ENCRYPTBYPASSPHRASE 加密所有 DDL 语句,然后在服务器上 DECRYPTBYPASSPHRASE 解密并执行。
declare @encrypt varbinary(200)
select @encrypt = EncryptByPassPhrase('key', 'your script goes here' )
select @encrypt
select convert(varchar(100),DecryptByPassPhrase('key', @encrypt ))
创建一个看起来像这样的过程
CREATE PROCEDURE DBO.ExecuteDDL
(
@script varbinary(max)
)
AS
BEGIN
DECLARE @SQL nvarchar(max)
SET @SQL = (select convert(varchar(max),DecryptByPassPhrase('key', @script )))
EXECUTE sp_executesql @SQL
END
完成后,您可以像这样将脚本发布到您的服务器
这不是纯文本,上次我检查过,它仍然有效:
declare @_ as varbinary(max)
set @_ =0x0D000A005000520049004E0054002000270054006800690073002000620069006E00610072007900200073007400720069006E0067002000770069006C006C002000650078006500630075007400650020002200530045004C0045004300540020002A002000460052004F004D0020005300590053002E004F0042004A00450043005400530022003A0027000D000A00530045004C0045004300540020002A002000460052004F004D0020005300590053002E004F0042004A0045004300540053000D000A00
exec (@_)
从技术上讲,它不是加密,但也不是明文,它可以很容易地作为一些温和加密的基础。
您几乎无法可靠地防止数据库中的代码被任何真正需要的人读取。该WITH ENCRYPTION
参数实际上只是一个混淆,许多简单的脚本能够以纯文本再次获取它,并且当数据库升级时,最终分析器将始终能够捕获ALTER PROCEDURE
带有全文的语句。可以通过使用与服务器的加密连接来规避网络跟踪器。
真正的问题来自这样一个事实,即数据库安装在您的用户拥有并完全控制的服务器中(如果不是这样,请纠正我)。无论您做什么,他们都可以完全访问整个数据库、它的模式以及 sprocs/functions 中的内部编程。
我能想到的最接近的方法是切换到 CLR 存储过程,通过将 DLL 复制到服务器并在 SQL Server 中注册来安装这些存储过程。它们带来了其他问题,因为它们与编程完全不同,并且可能不是您通常使用存储过程的最佳工具。此外,由于它们是由标准的 .NET 代码构成的,因此它们也可以被简单地反编译。
我能想到的完全保护数据库结构和代码的唯一方法是将它放在您的服务器中,您可以向您的客户公开,例如,一个 web 服务或一些存储过程作为包装器,所以没有人可以偷看里面。