如何在PHP中实现部分代码加密?基于ZendGuard的局部加密方法是什么?

说实话,PHP 加密是一个选择问题。
使用 ZendGuard 清理核心代码。
只需保留关键文件,例如支付逻辑。
非核心的,如控制器和视图,应该保持可读以方便开发。

我们先来说一下 ZendGuard 是如何做到的。
您必须首先安装ZendGuardEncoder并将其安装在开发环境中。
然后,仔细选择算法和商业秘密并分别加密。
例如app/Services/PaymentGateway.php,不要修复无用的。
必须正确配置加密选项,例如重命名变量名称和函数名称。
许可证绑定还取决于具体情况,例如域名、IP 或过期时间。
最后运行生成加密文件,替换原来的文件或者放到指定目录下。

部署时,您必须安装 ZendGuardLoader,它必须存在于服务器上。
Zendguard是一个把PHP代码转换成抽象语法树,再转换成字节码,然后加密的东西。
运行时直接执行字节码,无需恢复源代码。
带来的效果是普通用户无法理解,逆向工程也很难。
不过性能会损失一点,而且一旦PHP版本升级,可能会出现不兼容的情况。
调试起来也很麻烦。
加密的代码无法直接调试,必须在开发环境中留下未加密的版本。

有多种选择。
IonCubeLoader/Encoder被很多人使用,兼容性好,并且有很多许可选项,但价格昂贵。
SourceGuardian 编码速度快且高效,但缺乏社区支持。
PHPObfuscators是一种代码混淆工具,不需要Loader,成本低廉,但安全性较差,容易恢复。
自定义编译/扩展最安全,但开发成本高,中小企业无法应对。

实际项目中如何权衡? 首先明确目的和范围。
核心逻辑加密,非核心逻辑不加密。
如果需要授权,请对相关文件进行加密。
必须优化开发流程。
开发环境必须未加密。
对于版本控制,加密文件必须被视为二进制文件,并且必须保留原始代码。
对于错误日志,创建一个映射表,方便排查问题。

还应注意性能和兼容性。
必须衡量高并发系统的性能影响。
当PHP升级时,Loader也必须改变。
安全性和成本之间必须取得平衡。
如果风险很高,就收紧措施。
否则,加强服务器和网络安全。
员工培训也很重要,加密只是补充措施。

总结一下,只是部分加密,不要做太多。
加密过程需要自动化,例如通过合并 CI/CD 管道。
就安全优先而言,服务器和网络加密比代码加密更有效。
目标是保护关键资产,而不是为了安全而安全。

PHP 8如何加密敏感数据

那天在咖啡馆,我正在帮朋友调试加密代码,他突然问我:“为什么这个RSA加密这么慢?”我看着屏幕上的 openssl_public_crypt,突然意识到我们可能使用了过于简单的加密。

PHPpassword_hash() 函数确实很方便,但不要用它来加密 ID 号。
去年我就差点犯了这个错误。
在一个老项目中,我看到有人使用password_hash来保存银行卡密钥,结果崩溃了。
bcrypt 最初被设计为单向的。
如果你要求他朝相反的方向工作,他会感到困惑。

对称加密的陷阱更加隐蔽。
有一天,当我测试 AES-2 5 6 -CBC 时,我将 IV 复制粘贴了三遍。
解密后才发现所有数据都搞混了。
DES 早就应该被删除了,但是在检查代码时我还看到了 DES-CBC 行。
当时我没有使用手动滑块更改它,但后来我记得添加了 AES-2 5 6 -CBC。

混合加密的想法其实还不错。
之前我使用RSA进行对称密钥加密,然后使用AES进行文件加密。
解密时,我先解密RSA,再解密AES。
有一天,由于使用了错误的密钥路径,解密过程停滞了十分钟。
后来发现file_get_contents没有添加true参数,也没有将私钥读取为文本。

密钥管理确实很困难。
我曾经使用环境变量来存储密钥,并且特定服务器的权限被提升。
我像读小说一样读RSA私钥。
我们目前正在使用 KMS,但存在一个错误。
我们在密钥轮换期间忘记更新代码,导致两周后数据解密失败。
等等,还有一件事:KMS API 请求延迟有时足以让人抓狂。

在调试IV问题时,我编写了一个生成器,每次加密时都会自动保存IV。
然而,在测试过程中我忘记清理旧文件。
结果,解密时密文不匹配。
编码错误甚至更有趣。
我曾经直接使用json_encode来加密二进制数据,但是当解密后,它们甚至没有转换回 Base64 团队现在规定,在对二进制数据进行所有操作之前,必须有人喊“Base64 !”
在优化性能时,我们使用了AES-NI OpenSSL加速,CPU负载立即降低。
但有一个加密 3 MB 文件的测试用例,处理器仍然崩溃。
后来发现是算法参数配置错误,切换到GCM模式后速度急剧提升。
第三方库?我们尝试了某个标榜“更快”的加密库,但发现每次加密都多花了 0.5 秒,所以我们最终切换回 OpenSSL。

简历?混合加密固然很好,但您不能掉以轻心。
密钥管理比加密算法本身更危险,这是我去年差点付出的代价。
突然我在想,量子计算是否会让现有的加密系统变得毫无用处?这是另一个应该探讨但不能立即解决的问题。