如何在SQL Server中保护一个有价值的存储过程

3

这个问题可能不太适合在这个平台上提问,但我非常信任这里的人们。

我正在为一个ERP系统编写数据传输应用程序,许多人创建的C#项目速度慢、不灵活,并且充满错误。我找到一种使用SQL SERVER和存储过程来完成它的方法。但是,我不想让我的存储过程被其他程序员窃取,因为存储过程有点像开源代码。我使用加密方式创建了存储过程,但我在互联网上发现了一个小应用程序,可以显示存储过程的内容。

有没有其他方法可以在SQL Server中对我的存储过程进行加密和保护呢?


当然,他们应该与我联系。这就是关键。如果我做了一个C#应用程序,他们会与我联系,因为他们无法看到应用程序的内部。 - Arif YILMAZ
@SQLPolice,如果他复制我的SQL并发送给许多公司,那我就会破产了。此外,为什么您认为.NET开发人员向客户提供二进制文件而不是源代码呢?这是商业上的考虑。 - Arif YILMAZ
毫无意义的讨论 - Arif YILMAZ
2个回答

3

你的应用程序完全由存储过程编写,没有其他代码吗?你认为有人真的想窃取你的代码的可能性有多大?我问这个问题是因为通常情况下,如果有人非常想要代码,他们会找到一种获取它的方法。如果他们甚至会伪造整个苹果商店,那么某些人总是可以破解任何加密方案。

保护你的知识产权(即代码)的最好方法是不将其提供给任何人:将其作为服务托管。除了这个明显、简单但并非总是可行的选择外,还有一些需要考虑的事情:

  1. 对于T-SQL存储过程,您可以使用内置加密来防止低端的盗窃行为。是的,您可以通过搜索找到解密方法,但并不是每个人都会这样做或知道该查找什么。这不是一个很大的障碍,但再次,这是一个非常容易实施的步骤,可以淘汰那些只是胡乱探索的人。
  2. 您可以将一些代码放入SQLCLR(即通过SQL Server的“CLR集成”功能/API使用.NET C#或VB),尽管这对于所有内容都不起作用,也不是做所有事情的好选择。但是,对于任何在SQLCLR中更有效的代码,获取程序集的源代码将更加困难。同样,这并非不可能,而且有免费的工具来反编译程序集,但这确实提高了门槛,因为某人需要将程序集提取到DLL,然后反编译它(虽然我相信有一个工具将其从SQL Server中提取出来,但仍比“如何解密加密存储过程”更难得到)
  3. 关于.NET代码(绝对是独立应用程序,可能还包括SQLCLR代码),也可以混淆程序集,使其非常难以反编译。例如,Red-Gate的SmartAssembly可以做到这一点。
  4. 比您的竞争对手更好:
    1. 创新并提供更好的功能(即更好的产品)。倾听客户的需求,让他们的生活变得更加轻松。即使有人最终获得了您的代码,他们也无法窃取您。被盗的代码可能会教给他们一些东西,但与您应该生产的内容相比,它基本上是停滞不前的。
    2. 提供更好的服务。亲切和仔细地回答问题,并带着微笑(即使是愚蠢的问题-如果需要,向朋友发泄,但不要书面写下来)。当然,有些客户决定仅根据价格购买,但是服务/支持通常是获取和保留客户的重要因素。
如果你能找到一个快速简便的方法来做这件事,那就太好了。但是,当你的时间更好地用于改进产品时,不要花太多时间在上面。此外,除非你想出了一些高度复杂的算法,否则大多数东西都可以被反向工程化,如果它们足够聪明的话。但是,如果你担心的人那么聪明,他们的软件会是“缓慢、不灵活和充满错误”吗?而且沿着同样的路线(只是为了说明),其他软件之所以“缓慢、不灵活和充满错误”,与它们是否使用C#无关(尤其是“不灵活和充满错误”的问题):它们只是没有写好;)。

我同意你的观点。一个更好的服务比一段代码更有价值。非常感谢你的时间。 - Arif YILMAZ

1

是的,有一种方法,只需在存储过程的定义中使用选项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.

确保您个人拥有存储过程的副本,保存在其他您无法查看存储过程定义的位置。


你只是忘了提到这种加密方式当然是可逆的。在 SQL Server 中,没有保护措施可以防止 DBA 的操作。 - Roger Wolf
WITH ENCRYPTION 很容易被反向解密。 - SQL Police

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接