信息加密是每一位程序员在学习软件研发技术的时候都会接触到的一个编程技术,下面咱们就一块来认识一下,程序员都必须把握那些信息加密解密办法。
1、加密的本质
本质上程序在运行时都是在执行设备码,而基于虚拟机的语言的加密一般亦是加密到这个级别,亦便是说PHP加密后的程序在执行之前都会解密成opcode来执行。
PHP在执行之前有一个编译的环节,编译的结果是opcode,而后由Zend虚拟机执行,从这儿看倘若只要将源代码加密,而后在执行之前将代码解密就可。
从这儿看,只要代码能被解密为opcode,那样总有可能反编译出源自代码,其他的语言中亦是类似,例如objdump程序能将二进制程序反汇编出来,.NET、Java的程序亦是同样,都有有些反编译的程序,不外一般这些厂商同期还会附带代码混淆的工具,经过混淆的代码可读性极差,非常多人都留意过Gmail等网站经过混淆的JS代码吧,她们阅读起来非常困难,经过混淆的代码即使反编译出来,读者亦很难经过代码分析出代码中的规律,这般亦就极重的增多了应用的安全性。
2、加密
前面说到加密的目的便是为了防止轻易获取程序源码的一种手段,针对PHP来讲,将源码编译为opcode已然能达到目的了,由于PHP引擎终都是必须执行opcode的。虽然能够将加密进一步,然则倘若必须修改Zend引擎,那样成本就有点大了,由于必须修改Zend引擎了,而这是没法经过简单的扩展机制来实现了,因此解密的成本亦会变的太大,亦就无实质道理了。
熟悉PHP的朋友可能会发掘,这种加密方式和opcode缓存本质上无太大差别,opcode缓存的工作是将源码编译为opcode而后缓存起来,在执行的时候绕过编译直接执行opcode,的确是没错的。这儿的区别是:opcode缓存是动态透明的,而加密后咱们要做的是分发加密后的代码。这么说咱们是不是能够直接将APC之类的缓存扩展进行改造就能够了,其实理论上是能够的。不外这两者的定位还是有差别的:加密的目的是为了减少源码被分析破解的可能,而缓存只是为了加强程序运行的速度。
3、解密
本例中的代码其实并无进行加密,相对源代码来讲,opcode编译本身亦能够算做一种加密了,由于毕竟经过阅读opcode来理解程序的规律还是比较困难的。
|