我们有一个用Perl编写的旧网站,其中包含用于连接某些数据库的敏感密码。
保护Perl代码的最佳方法是什么?我们对Perl和CGI的了解很少,但是我们需要解决此问题的方法,因为它会带来安全风险。
我们正在寻找加密/混淆解决方案,我们阅读了有关Filter :: Crypto :: Decrypt的信息,但不知道如何应用它。我们也偶然发现了该网站(http://enscryption.com/),但对此持怀疑态度。
我们非常感谢您提供一些分步骤的简单指导! :)
谢谢!
答案 0 :(得分:2)
您不能保护代码。 As Ikegami said,为了运行代码,您需要解密代码。
但是您可以保护敏感信息。最简单的方法是将其放入环境变量中,并确保在程序运行时设置了这些变量。
例如,如果您有...
my $dbpassword = "sekret";
您将其更改为...
my $dbpassword = $ENV{DBPASSWORD};
并确保在程序运行时将DBPASSWORD
环境变量设置为sekret
。这既将秘密移出了源代码,又使代码更加灵活。您可以将秘密存储在一个地方,使它们更易于管理。这样可以确保这些机密永远不会存储在磁盘上。
类似地,如果您的机密位于文件中,则可以对该文件进行加密。然后让Perl代码使用存储在环境变量中的密钥解密文件。同样,机密绝不会明文存储在磁盘上。这类似于Rails Encrypted Credentials。
如何安全地存储这些机密并设置这些环境变量取决于您的服务器设置。将存储秘密的问题移出旧版Perl代码后,您将有很多选择。
答案 1 :(得分:1)
来自Perl FAQ:
How can I hide the source for my Perl program?
删除它。 :-)严重的是,有很多(主要是 级别的“安全性”的解决方案)。
但是,首先,您不能取消读取权限,因为 源代码必须可读才能编译和 解释。 (这并不意味着CGI脚本的源是可读的 但是,仅由网络上的用户访问-仅由有权访问 文件系统。)因此,您必须将权限留给社交 友善的0755级。
有人认为这是一个安全问题。如果您的程序确实 不安全的事物并依赖于不知道如何利用这些事物的人 不安全,这是不安全的。通常有人可以 确定不安全的事物并在不查看 资源。默默无闻的安全性,即隐藏错误的名称 除了修复它们,安全性确实很小。
您可以尝试通过源过滤器使用加密(从Perl开始 5.8 Filter :: Simple和Filter :: Util :: Call模块包含在标准发行版中),但是任何体面的程序员都可以 解密。您可以尝试使用字节码编译器和解释器 稍后在perlfaq3中进行了介绍,但好奇的人仍然可以 反编译它。您可以尝试使用所述的本机代码编译器 后来,但饼干可能能够将其拆卸。这些姿势 希望获得您的代码的人有不同的难度, 但没有人能够明确地掩盖它(每种语言都适用,而不仅仅是 Perl)。
恢复Perl程序的源非常容易。你只是 将程序提供给perl解释器,并使用 B ::等级制度。 B :: Deparse模块应该能够击败大多数 尝试隐藏源。同样,这不是Perl独有的。
如果您担心有人会从您的代码中获利,那么 最重要的是,只有限制性许可才能给您 法律安全。许可您的软件,并威胁性地将其添加 诸如“这是XYZ Corp.未发布的专有软件。 您对它的访问权不授予您使用它的权限等等 等等。”我们当然不是律师,因此,如果您 您要确保许可证的用词能在法庭上站出来。