PHP 加密解密详解
1. MD5加密
介绍:
MD5(Message Digest Algorithm 5)是一种被广泛使用的密码散列函数,可以产生一个128位(16字节)的散列值。它主要用于验证数据完整性和存储用户密码(虽然现在单独使用MD5存储密码不安全)。
加密示例代码:
解密说明:
MD5是单向加密算法,理论上不能直接解密。但是可以通过彩虹表(预先计算好的常见密码及其MD5值的对照表)或者暴力破解(尝试所有可能的字符组合)来找到原始数据,但这对于复杂的密码难度很大。在实际应用中,为了安全起见,现在一般不建议使用MD5来存储密码,因为其存在碰撞(不同的数据产生相同的MD5值)等安全隐患。
2. SHA 1加密
介绍:
SHA 1(Secure Hash Algorithm 1)是一种密码散列函数,它可以生成一个160位(20字节)的散列值。和MD5类似,它主要用于数据完整性验证等场景。
加密示例代码:
解密说明:
SHA 1也是单向加密算法,不能直接解密。其安全性比MD5稍高,但也存在一些安全漏洞,同样可以通过彩虹表等方式尝试找到原始数据,但破解难度较大。
3. AES加密(高级加密标准)
介绍:
AES是一种对称加密算法,这意味着加密和解密使用相同的密钥。它被广泛用于加密敏感数据,如用户的个人信息、支付信息等。AES支持128位、192位和256位密钥长度,密钥长度越长,安全性越高。
加密示例代码:
解密示例代码:
4. RSA加密(非对称加密)
介绍:
RSA算法是一种非对称加密算法,它使用一对密钥:公钥和私钥。公钥用于加密数据,私钥用于解密数据。这种加密方式在网络通信、数字签名等领域有广泛应用。
加密示例代码(简单步骤):
首先,需要生成密钥对。可以使用`openssl`扩展:
然后,使用公钥加密数据:
解密示例代码:
在实际应用中,选择加密方法要根据具体的需求和安全级别来决定。例如,对于密码存储,建议使用安全的哈希算法(如bcrypt、scrypt等,虽然在示例中未详细介绍,但这些算法在密码存储方面更安全,因为它们具有内置的防暴力破解和抗彩虹表攻击的特性)结合盐值(随机字符串,添加到密码中一起哈希,增加破解难度);对于数据传输中的加密,可以使用AES或RSA等加密方式。
php源代码保护——PHP加密方案分析&解密还原
php是一种解释型脚本语言.与编译型语言不同,php源代码不是直接翻译成机器语言.而是翻译成中间代码(OPCODE) ,再由解释器(ZEND引擎)对中间代码进行解释运行 .
在php源代码的保护在原理可以分为3大类.
- 源代码混淆(编码)
- OPCODE混淆(编码)
- 修改解释引擎(虚拟机)
在部署上可以分为2大类.
- 无扩展
- 有扩展
下面分析下各种加密方案的实现方法
源代码混淆
无限扩展的加密在一些小开发者比较常见。这种源代码保护方式侵入性小,无需对服务器做额外的配置,兼容性较强。
这种情况混淆后的源代码还原非常简单,可完全还原出源代码。 有时连注释都会保留 (x 我觉得这种混淆都不能称之为加密基本流程 压缩代码->混淆变量函数类名->使用简单函数和方法进行编码加密 例:base64 异或
【点击查看资料】或私信回复“资料”获取
手工解密
看到这种的php不要慌 这种处理后的文件 解密流程的变量和函数名使用了大量的非打印字符 按照正常的流程就可以ctrl+alt+l 快捷键 格式化代码 (这里使用的PhpStorm 其他IDE 格式化遇到特殊符号可能出问题 这里提前调整好了文件编码)
这里有一个php的特性 php中的base64遇到非base64表中字符会直接忽略 不会影响解码注: PHP7 遇到空字符可能会抛出error 可以使用php5.6执行 (这里有一个兼容性问题 )遇到这种加密最简单的方法就是找文件中最后一步执行的函数 直接把内容打印出来
这种编码方法最后一步肯定要使用eval执行还原后的php代码 所以打印最后一个函数基本上php代码就会全部出来 (x 前面操作一大顿毫无卵用注: 有保护方案也使用了call_user_func或call_user_func_array间接调用eval
成功还原源代码 <?php phpinfo();?>
自动化通用解密
PHP提供了强大的扩展功能 可以直接通过编写php扩展hook eval相关函数 获取执行的源代码HOOK php zend引擎的 zend_compile_string zend_include_or_eval 函数达到目的这里演示的是 hook zend_compile_string 函数
成功还原源代码
源代码混淆
使用php扩展的代码混淆和无扩展代码混淆比较相似,只不过是把代码还原过程从php代码转到了php扩展。同样是使用aes des 异或等加密方法直接加密php代码,HOOK翻译php的函数在翻译PHP文件前对文件进行解密操作。这种方案也可以完全还原出源代码。在无其他混淆和压缩时甚至还会保留注释。
手工解密
这里以beast为例.首先在php的扩展目录下找到beast.sobeast的加密方案会把加密key编译进扩展中. 我们只需要寻找key就可以完成解密beast由于是开源项目.有现成的符号表和源码这使得反编译寻找key变得非常简单.但这样有点太简单了. 所以这里演示的是在没有源码的情况下使用IDA分析解密流程.
首先在导入表找到zend_compile_file这个函数会将php文件翻译成opcode因此大部分php加密扩展都需要hook这个函数达到拦截php文件载入和替换php文件的功能
继续跟入发现有两个函数一般在这种php加密扩展设计时会对这个函数有两次操作:一个是在启动时hook 这个函数,一个是在停止时恢复这个函数。继续跟入启动hook
显然文件处理逻辑在cgi_compile_file内
跟踪文件句柄decrypt_file函数的参数存在文件句柄 所以这个函数应该就是文件解密函数
根据代码可以看出beast 加密文件的结构| encrypt_file_header_sign 文件头标记(不固定 可修改)| reallen文件长度 int 4字节 | expire 到期时间 int 4字节| entype 加密方式 int 4字节| 加密后文件|
分析文件头发现该文件加密方式为 02
跟入beast_get_encrypt_algo
2对应的是 aes_handler_ops
使用了AES 128 ECB加密模式直接提取key参数内容长度刚好16位
到这一步就成功拿到了加密秘钥
使用拿到的KEY就可以解密PHP文件
自动化通用解密
编写php扩展 HOOK zend_compile_file函数
beast的加密不会对php文件做额外的操作 解密文件与加密前原文件完全一致php注释和原格式都会保留注意: 这里扩展加载顺序问题 建议直接修改php源码Zendzend_language_scanner.cZEND_API zend_op_array *compile_file
php会将源代码翻译成类似汇编的二进制中间操作码再交给zend引擎执行。之前的介绍的都是编译之前对php源代码的直接操作。这里是对opcode的操作,跳过翻译过程,直接把现成的opcode交给zend引擎执行(不同版本PHP引擎编译出的opcode可能会有兼容性问题)。这种php代码防护方法 只能hook zend_execute 拿到opcode。 不可能直接得到原本的源码,只能通过反编译尽可能的还原源代码。大部分商业php保护方案都使用这种可靠的方案为基础 _ZendGuard(zend) _SourceGuardian(SG) IonCube (IC) Swoole Compiler上面的方案有的还对zend引擎进行了魔改,使翻译出的opcode只能在修改后的引擎执行,进一步增强了安全性。
还原代码
hook zend_execute 拿到opcode使用对应版本的php操作码反推php代码太菜了不会反编译)
私信回复“资料”获取以下:
1、200多本网络安全系列电子书2、全套工具包3、100份src源码技术文档4、网络安全基础入门、Linux、web安全、攻防方面的视频6、 网络安全学习路线7、ctf夺旗赛解析
PHP扩展编译
phpize 生成Makefile
配置编译选项 启用扩展
最后执行make 编译扩展编译好的扩展会放在./modules/ 目录下使用扩展
可以重复使用-d extension 加载多个扩展
在选用PHP源码保护方案时 尽量选择opcode或虚拟机方案源代码混淆类只能对源代码获取和阅读增加一点困难 在加密扩展可被攻击者获取到时并不能起到保护作用
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。