87-代码的加密与解密

原创 2016年04月28日 22:00:44

87-代码的加密与解密

PHP语言作为脚本语言的一种,由于不需要进行编译,所以通常PHP程序的分发都是直接发布源代码。 对于一些开源软件来说,这并没有什么问题,因为它本来就希望有更多的人阅读代码,希望有更多的人参与进来, 而对于商业代码来说,这却是一个不太好的消息,不管是从商业秘密,还是从对公司产权的保护来说却是一个问题, 基于此,从而引出了对PHP代码的加密和解密的议题。 例如国内的Discuz论坛程序在开源之前要运行是必须安装Zend Optimizer的, Zend官方的代码加密软件是Zend Guard, 可以用来加密和混淆PHP代码,这样分发出去的代码就可以避免直接分发源代码, 不过加密后的代码是无法直接运行的,在运行时还需要一个解密的模块来运行加密后的程序, 要运行Zend Guard加密后的代码需要安装Zend Optimizer(PHP5.2之前的版本), 或者安装Zend Guard Loader(PHP5.3版本)扩展才能运行。

加密的本质

本质上程序在运行时都是在执行机器码,而基于虚拟机的语言的加密通常也是加密到这个级别, 也就是说PHP加密后的程序在执行之前都会解密成opcode来执行。

PHP在执行之前有一个编译的环节,编译的结果是opcode,然后由Zend虚拟机执行, 从这里看如果只要将源代码加密,然后在执行之前将代码解密即可。

从这里看,只要代码能被解密为opcode,那么总有可能反编译出来源代码, 其他的语言中也是类似,比如objdump程序能将二进制程序反汇编出来, .NET、Java的程序也是一样,都有一些反编译的程序,不过通常这些厂商同时还会 附带代码混淆的工具,经过混淆的代码可读性极差,很多人都留意过Gmail等网站 经过混淆的JS代码吧,他们阅读起来非常困难,经过混淆的代码即使反编译出来, 读者也很难通过代码分析出代码中的逻辑,这样也就极大的增加了应用的安全性。

简单的代码加密解密实战

根据前文的介绍,作为实例,本文将编写一个简单的代码加密扩展用于对PHP代码的加密, 我们只需要能把源码加密,简单通过浏览源代码的方法无法获取到源代码那我们的目标就达到了, 为了能正确执行加密后的代码,我们还需要另一个模块:解密模块。

简单的思路是把所有的PHP文件代码进行加密,同时另存为同名的PHP文件, 这是一种很简单的做法,只是为了防止源代码赤裸裸的暴露在代码中。

加密也有很多种做法,第一种简单的方法可以简单的把源码本身进行一些可逆加密, 这样我们可以在运行之前把真实的源码反解出来执行,不过这种方式存在一种问题, 只要知道了加密算法我们就可以把代码给解出来,采用这种方式唯一能做的就是尽量 增加加密的复杂度,既然正式的代码在运行之前会被转化成PHP源代码,通过hack的方式是可以 完完整整的获得PHP源码的,保密的效果就很有限了。

因为Zend引擎最终执行的是opcode,那么我们只要保证能解密出opcode则能满足需求, 我们只要简单的将opcode进行简单的序列化或者像Zend Guard那样进行混淆, 在运行之前将opcode还原,那么源代码的信息就不存在了,这样我们就能保证源代码的安全, 而不至于泄露。

加密

前面提到加密的目的就是为了防止轻易获取程序源码的一种手段,对于PHP来说, 将源码编译为opcode已经能达到目的了,因为PHP引擎最终都是需要执行opcode的。 虽然可以将加密进一步,但是如果需要修改Zend引擎,那么成本就有点大了,因为需要修改 Zend引擎了,而这是无法通过简单的扩展机制来实现了,所以解密的成本也会变的太大, 也就没有实际意义了。

在本例中为了方便,代码的加密和解密实现均实现在同一个模块中。

熟悉PHP的同学可能会发现,这种加密方式和opcode缓存本质上没有太大差别,opcode缓存的工作是将 源码编译为opcode然后缓存起来,在执行的时候绕过编译直接执行opcode,的确是没错的。这里唯一的区别是: opcode缓存是动态透明的,而加密后我们要做的是分发加密后的代码。这么说我们是不是可以直接将 APC之类的缓存扩展进行改造就可以了,其实理论上是可以的。不过这两者的定位还是有差别的: 加密的目的是为了减少源码被分析破解的可能,而缓存只是为了提高程序运行的速度。

解密

本例中的代码其实并没有进行加密,相对源代码来说,opcode编译本身也可以算做一种加密了, 因为毕竟通过阅读opcode来理解程序的逻辑还是比较困难的。

【Windows】加密服务

加密服务 您可以使用加密来确保应用程序层数据的安全。加密服务提供程序 (CSP)是系统程序接口中显示的加密标准、算法和函数的实施。 Jonathan Wiggs  在 MSDN 杂志中发表了一篇...
  • chenlu5201314
  • chenlu5201314
  • 2016年12月01日 10:36
  • 507

加密与解密:一个简单的C语言示例

写在前面 做大一年级的导生,碰巧一个同学问了一个C语言程序设计的题目。说是怎么都弄不对。我看了看,正好也是三年前我碰到的题目,仿佛还噙着旧日时光的泪痕。特此将题目与我的解法奉上,以祭奠那段逝去的时光...
  • Meditator_hkx
  • Meditator_hkx
  • 2015年10月27日 11:14
  • 11245

源代码加密几种简单方法

1. Java 程序名为 EncryptFile.java。在命令行运行方法为 java EncryptFile input_file passwordoutput_file 2. 实现利用密码对输入...
  • cnsinda
  • cnsinda
  • 2015年04月09日 11:27
  • 793

简单的一行代码实现加密解密

iOS端公钥加密私钥解密、java端公钥加密私钥解密,java端私钥加密公钥解密都容易做到,iOS不能私钥加密公钥解密,只能用于验签。 问题1:iOS端公钥加密的数据用Java端私钥解密。 iOS无论...
  • hbblzjy
  • hbblzjy
  • 2016年06月22日 12:17
  • 1203

C# 程序简单实现加密解密程序代码

C# 程序简单实现加密解密程序代码
  • wangmengmeng99
  • wangmengmeng99
  • 2015年10月25日 16:47
  • 1389

JS七种加密解密方法

HTML或JS加密解密     本文一共介绍了七种方法:     一:最简单的加密解密     二:转义字符"\"的妙用     三:使用Microsoft出品的脚本编码器Script...
  • doulinxu
  • doulinxu
  • 2017年03月07日 15:46
  • 5580

又一个加密PHP脚本的解码方法

三个星期以前我发布了一篇文章,介绍了base64加密的PHP脚本的解码方法。前几天,飞信好友行者又扔来了一段更加复杂、诡异的PHP脚本: 下载每一步的源代码 //0.php php $OOO...
  • hany3000
  • hany3000
  • 2015年02月02日 16:27
  • 2072

java代码实现加密解密(MD5签名(同步接口))

java代码实现对数据的加密,并实现数据加密后的解密,并进行签名操作
  • wwg2413980145
  • wwg2413980145
  • 2016年08月24日 16:11
  • 6680

Java的MD5加密和解密类

理解MD5 MD5的应用非常广泛。例如我们在unix中下载某种软件时,常常会看到一个扩展名为.md5的文件,内容大概是: MD5 (tanajiya.tar.gz) = 0ca175b9c0f72...
  • shuangshuang37278752
  • shuangshuang37278752
  • 2013年04月12日 20:39
  • 12859

几种加密解密的方法(仅代码)

1.Base64 编码: byte[] encode = Base64.encode(str.getBytes(), Base64.DEFAULT);new String(encode) 解码: b...
  • try_zp_catch
  • try_zp_catch
  • 2017年05月17日 10:53
  • 172
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:87-代码的加密与解密
举报原因:
原因补充:

(最多只允许输入30个字)