如何签署PHP源代码

时间:2017-01-09 08:38:27

标签: php openssl digital-signature code-signing phar

我想发布一些PHP源代码, 我需要提供一种方法来验证这些源代码是否未被更改。

所以基本上我想签名(如果可能的话使用PHP),然后检查他们的签名(使用PHP是必须的,它必须在linux和windows上工作)。

我一直在挖掘,我发现的是:

  • 签字:
    • 您可以使用PharData
    • 创建一个zip存档
    • 您可以使用openssl创建pub / priv。
    • 您可以使用Phar::setSignatureAlgorithm
    • 对PharData进行签名
    • 您似乎必须将公钥与存档一起放置(source(请参阅步骤3)): 公钥必须与Phar文件同名,并添加.pubkey,并且必须与Phar位于同一目录中。
  • 验证:

如果有人可以验证此过程(或表示更好的过程),那将是一个很好的帮助。

因为我试图给出我从现在开始的理论解决方案,但在理论和实践之间,它们应该是一个差距。特别是考虑到我对这个概念不熟悉,并且我的项目在安全方面具有可靠性至关重要。 我提醒说,几年前使用苹果的签名过程是一件很痛苦的事情,而且我对创建安全解决方案的能力没有信心。

1 个答案:

答案 0 :(得分:0)

关于签名的phar文件,我上次检查时的默认行为是:

  • 如果签名有效,请从phar检索文件(如果是php,则执行)
  • 如果签名无效,则抛出错误
  • 如果没有签名,请从phar检索文件(如果是php,则执行)

因此,很容易通过简单地剥离签名来绕过签名保护(实际上,您只需要将文件标记为未签名即可)。您可以显式设置phar.require_hash选项,以在实例中删除此后门。

  

确认这些源代码未更改

嗯。这有点含糊。由谁修改?如上所述,您需要客户端选择加入基于Phar签名的安全模型。

有很多第三方PHP编码器通过混淆代码来工作。它们几乎都提供了可笑的保护级别。 IonCube编码器和Zend编码器有几个例外。我对这些还不够熟悉,无法说出它们的强度以及它们是否满足您的要求。

有一些开源的PHP编译器可以将PHP源代码转换为.so扩展名(特别是Facebook HipHop),但我认为两者都不会得到维护。

如果您只想确保已验证的内容可供客户使用(并且您不担心客户修改文件),则只需对PGP或x509使用标准文件签名即可。

如果您想防止客户修改PHP代码,那么我知道的唯一选择(并且我自己尚未对其进行测试)是将代码作为HHVM字节码分发-但这不能抵抗反向工程,它没有内在的,安全的验证机制,并且实际上不打算用作保护代码的方法。