是因为它们固有的开源哲学吗?
加密存储过程的强有力理由是什么?
我相信在PostgreSQL中,加密存储过程至少是编程方面的一个简单问题(MySQL和存储过程之间没有很长的历史),由于PgSQL的自定义语言支持,我不认为这会有什么用。它们需要在某个时刻被解密以执行它们,因此任何管理数据库/数据库服务器的人都能够(如果具备足够的技能)获取未加密的存储过程。DBA已经可以看到所有数据、所有关系,似乎使存储过程代码混淆无意义。
Postgresql: http://www.postgresql.org/community/lists/
MySQL: http://lists.mysql.com/
可能是因为没有人有这方面的需求。
加密存储过程是一个明显不好的想法。
商业编程不应该围绕着只有DBA可以访问完整SQL代码并以加密形式存储在数据库中的情况进行。这样会导致疯狂的结果。
(关于加粗文本)我认为这不太对。如果您曾经使用过ACT!联系人管理系统,他们会将MSSQL Express作为单独的实例安装,并使用私有用户名和密码来访问SQL和数据库。因此,有方法可以不与客户共享数据库。
不想引发宗教战争,但像MSSQL这样的数据库服务器具有存储过程加密功能。其想法是,如果您是ISV,则可以部署带有加密存储过程的解决方案以保护您的知识产权。作为DBA,您无法解密这些存储过程。
以上仅供参考。
我曾经为InterBase提供支持,这个问题会不时出现。客户需要这个功能的原因是保护他们的“知识产权”——即源代码——在开发商业软件应用程序时的投资。
当然,您可以限制对C++、Java或Delphi等已编译语言的源代码的访问。一个客户可以反向工程已编译的代码并了解一些算法,但这与访问源代码不同。通过反编译,他们得不到很多信息。
但是,如果在触发器和存储过程体中实现应用程序的某些部分,则任何购买该软件产品的客户都可以读取这些内容。可能有办法模糊或加密此代码,但它不能是不可逆加密,否则数据库引擎将无法运行代码。
InterBase在BLOB字段中存储触发器/proc源代码的副本以及相同例程的已编译版本。因此,您可以将包含源代码的BLOB字段置为空,留下已编译的代码。但这仅与发布编译的应用程序代码一样有效;它仍然可以被具备足够技能和动力的盗版者进行反向工程。
我不知道在MySQL或PostgreSQL中是否可能使用NULL-out-the-source-BLOB技巧。
底线是:
值得注意的是,这是一个人为的要求。我从未听说过由于触发器和存储过程中有可读代码而导致软件IP被盗的人。无论如何,这也不是必要的。盗版者可以使用其他手段复制您的软件。
以下是我个人认为的一种加密存储过程/视图的好方案。我所在的公司编写了一个数据库驱动的应用程序。我们将数据库放置在客户网络上的SQL服务器或运行SQL Express的工作站上(适用于用户较少的小型客户)。存储过程和视图用于审计客户提供给我们的数据。为了防止客户的DBA或IT人员简单地窃取我们的专有算法,我们对存储过程和视图进行加密。我们在版本控制软件(如Visual Source Safe)中维护原始的明文脚本,以便我们端的支持团队可以访问并查看过程或视图的编码方式。我希望一些开源引擎也能够支持它,这样我们就可以摆脱SQL Express的限制。