如何在 sql 服务器中保护有价值的存储过程
how to secure a valuable stored procedure in sql server
这个问题可能不适合这个平台,但我非常信任这里的人。
我正在为 ERP 系统编写数据传输应用程序,许多人创建的 C# 项目速度慢、不灵活且充满错误。我在 SQL SERVER 中使用存储过程找到了一种方法。但我不希望我的 SP 被任何程序员窃取,因为 SP 是开源的。我创建了加密的 SP,但我在互联网上找到了一个可以显示 SP 内容的小应用程序。
是否有任何其他方法可以在 sql 服务器中加密和保护我的 SP?
是的,有一种方法,只需在您的 sp 定义中使用选项 WITH ENCRYPTION
。
例子
CREATE PROCEDURE spEncryptedProc
WITH ENCRYPTION
AS
BEGIN
SELECT 1
END
GO
现在尝试查看该过程的定义......
exec sp_helptext 'spEncryptedProc'
Result: The text for object 'spEncryptedProc' is encrypted.
确保您个人在其他地方保存了存储过程的副本,您自己看不到过程定义。
您的应用程序是否完全用存储过程编写,没有其他代码?您认为有人真的想要窃取您的代码的可能性有多大?我之所以问,是因为通常情况下,如果有人非常想要代码,他们会想办法得到它。如果他们能做到 counterfeit an entire Apple store 那么总有人可以破解任何加密方案。
保护您的知识分子 属性(即代码)的最佳方式就是不要将其提供给任何人:将其托管为一项服务。除了这个明显、简单但并非总是可行的选项之外,还有一些需要考虑的事项:
对于 T-SQL 存储过程,您当然可以通过使用内置加密来阻止低端窃贼。是的,你找到了一种通过四处搜索来解密它的方法,但并不是每个人都会这样做或知道要寻找什么。这不是什么障碍,但同样,这是一个非常简单的步骤,可以淘汰那些四处闲逛的人。
您可以通过 SQL 服务器的 "CLR Integration" feature/API), 虽然这不是对所有事情都有效,但也不是对所有事情都做的好选择。但是,对于任何在 SQLCLR 中执行效率更高的代码,获取程序集的源代码会更加困难。同样,并非不可能,并且有免费工具可以反编译程序集,但这确实提高了标准,因为有人必须将程序集提取到 DLL,然后反编译它(尽管我相信一个工具会从 SQL 服务器,但比 "how to decrypt an encrypted Stored Procedure"
更难获得
关于 .NET 代码(绝对适用于独立应用程序,也可能适用于 SQLCLR 代码),也可以混淆程序集,使其变得非常困难,充其量反编译它。 Red-Gate 的 SmartAssembly 等产品可以做到这一点。
超越竞争对手:
- 创新并提供更好的功能(即更好的产品)。倾听客户的声音,让他们的生活更轻松。即使有人最终获得了您的代码,他们也无法窃取您。被盗的代码可能会教给他们一些东西,但与你应该生产的相比,它基本上是停滞不前的。
- 提供更好的服务。风度翩翩,面带微笑地彻底、恭敬地回答问题(即使是愚蠢/愚蠢的问题——如果需要,向朋友发泄,但绝不以书面形式)。当然,一些客户决定纯粹根据价格购买,但 service/support 通常是获得和 留住 客户的重要因素。
所以,如果您能找到一种快速简便的方法来完成此操作,那就太好了。但是当你的时间应该花在改进你的产品上时,不要花太多时间在上面。此外,除非你想出一些高度复杂的算法,否则大多数东西都可以逆向工程,如果它们足够聪明的话。但是,如果您担心的人那么聪明,他们的软件会是 "slow, not flexible and full of errors" 吗?沿着同样的思路,(只是说明一下),其他软件 "slow, not flexible and full of errors" 与用 C# 编写的软件无关(尤其是 "not flexible and full of errors" 问题):它们只是'写得很好 ;-).
这个问题可能不适合这个平台,但我非常信任这里的人。
我正在为 ERP 系统编写数据传输应用程序,许多人创建的 C# 项目速度慢、不灵活且充满错误。我在 SQL SERVER 中使用存储过程找到了一种方法。但我不希望我的 SP 被任何程序员窃取,因为 SP 是开源的。我创建了加密的 SP,但我在互联网上找到了一个可以显示 SP 内容的小应用程序。
是否有任何其他方法可以在 sql 服务器中加密和保护我的 SP?
是的,有一种方法,只需在您的 sp 定义中使用选项 WITH ENCRYPTION
。
例子
CREATE PROCEDURE spEncryptedProc
WITH ENCRYPTION
AS
BEGIN
SELECT 1
END
GO
现在尝试查看该过程的定义......
exec sp_helptext 'spEncryptedProc'
Result: The text for object 'spEncryptedProc' is encrypted.
确保您个人在其他地方保存了存储过程的副本,您自己看不到过程定义。
您的应用程序是否完全用存储过程编写,没有其他代码?您认为有人真的想要窃取您的代码的可能性有多大?我之所以问,是因为通常情况下,如果有人非常想要代码,他们会想办法得到它。如果他们能做到 counterfeit an entire Apple store 那么总有人可以破解任何加密方案。
保护您的知识分子 属性(即代码)的最佳方式就是不要将其提供给任何人:将其托管为一项服务。除了这个明显、简单但并非总是可行的选项之外,还有一些需要考虑的事项:
对于 T-SQL 存储过程,您当然可以通过使用内置加密来阻止低端窃贼。是的,你找到了一种通过四处搜索来解密它的方法,但并不是每个人都会这样做或知道要寻找什么。这不是什么障碍,但同样,这是一个非常简单的步骤,可以淘汰那些四处闲逛的人。
您可以通过 SQL 服务器的 "CLR Integration" feature/API), 虽然这不是对所有事情都有效,但也不是对所有事情都做的好选择。但是,对于任何在 SQLCLR 中执行效率更高的代码,获取程序集的源代码会更加困难。同样,并非不可能,并且有免费工具可以反编译程序集,但这确实提高了标准,因为有人必须将程序集提取到 DLL,然后反编译它(尽管我相信一个工具会从 SQL 服务器,但比 "how to decrypt an encrypted Stored Procedure"
更难获得
关于 .NET 代码(绝对适用于独立应用程序,也可能适用于 SQLCLR 代码),也可以混淆程序集,使其变得非常困难,充其量反编译它。 Red-Gate 的 SmartAssembly 等产品可以做到这一点。
超越竞争对手:
- 创新并提供更好的功能(即更好的产品)。倾听客户的声音,让他们的生活更轻松。即使有人最终获得了您的代码,他们也无法窃取您。被盗的代码可能会教给他们一些东西,但与你应该生产的相比,它基本上是停滞不前的。
- 提供更好的服务。风度翩翩,面带微笑地彻底、恭敬地回答问题(即使是愚蠢/愚蠢的问题——如果需要,向朋友发泄,但绝不以书面形式)。当然,一些客户决定纯粹根据价格购买,但 service/support 通常是获得和 留住 客户的重要因素。
所以,如果您能找到一种快速简便的方法来完成此操作,那就太好了。但是当你的时间应该花在改进你的产品上时,不要花太多时间在上面。此外,除非你想出一些高度复杂的算法,否则大多数东西都可以逆向工程,如果它们足够聪明的话。但是,如果您担心的人那么聪明,他们的软件会是 "slow, not flexible and full of errors" 吗?沿着同样的思路,(只是说明一下),其他软件 "slow, not flexible and full of errors" 与用 C# 编写的软件无关(尤其是 "not flexible and full of errors" 问题):它们只是'写得很好 ;-).