https://github.com/del-xiong/screw-plus
http://git.oschina.net/splot/php-screw-plus
screw plus是一個(gè)開(kāi)源的php擴(kuò)展镇草,作用是對(duì)php文件進(jìn)行加密扮惦,網(wǎng)絡(luò)上提供php加密的服務(wù)很多爽彤,但大多都只是混淆級(jí)別的加密,被人拿到加密文件問(wèn)只要有足夠耐心就能破解捐迫,與之不同的是,screw plus采用擴(kuò)展來(lái)加解密,而且是全球金融業(yè)流行的高強(qiáng)度AES256加密旭从,除非破解了服務(wù)器,否則黑客拿到了加密文件也只是一堆亂碼场仲。
同一個(gè)加密級(jí)別的有ioncube和官方的zend guard和悦,但這兩款都是收費(fèi)的,一年至少數(shù)千元的費(fèi)用并不值得普通開(kāi)發(fā)者去嘗試渠缕,而使用screw plus鸽素,你不需要多花一分錢(qián)。
下面以LNMP一鍵安裝環(huán)境為例演示下screw plus的配置
首先克隆一份代碼到服務(wù)器
git clone https://git.oschina.net/splot/php-screw-plus.git
進(jìn)入項(xiàng)目目錄亦鳞,然后執(zhí)行php的phpize文件馍忽,phpize是官方提供的可執(zhí)行文件用于動(dòng)態(tài)生成擴(kuò)展開(kāi)發(fā)環(huán)境,一般在php的bin目錄下可以找到燕差。lnmp的phpize在/usr/local/php/bin/phpize
/usr/local/php/bin/phpize
Configuring for:
PHP Api Version:? ? ? ? 20100412
Zend Module Api No:? ? ? 20100525
Zend Extension Api No:? 220100525
執(zhí)行成功后可以看到當(dāng)前的php api版本遭笋,擴(kuò)展api版本等。下一步就可以開(kāi)始配置了徒探。配置命令為 ./configure --with-php-config=[php-config], [php-config]一般也在php的bin目錄下瓦呼,寫(xiě)絕對(duì)路徑就可以了。
./configure --with-php-config=/usr/local/php/bin/php-config
如果沒(méi)報(bào)錯(cuò)测暗,說(shuō)明配置成功了央串,可以開(kāi)始下一步編譯了。
編譯之前碗啄,我們可以修改加密的key质和,打開(kāi)php_screw_plus.h可以看到開(kāi)頭就是 #define CAKEY "..." ,把里面的值改為一個(gè)足夠復(fù)雜的key,最好16位以上稚字,比如:9mqss6q7WsBpTMOZ
vi php_screw_plus.h
修改完畢之后饲宿,直接開(kāi)始編譯,執(zhí)行make命令胆描,如果最后顯示Build complete.說(shuō)明編譯成功褒傅,擴(kuò)展在modules里面,如果報(bào)錯(cuò)請(qǐng)根據(jù)提示進(jìn)行修復(fù)袄友,然后make clean之后重新編譯殿托。
make
...
Build complete.
上面我們編譯的是解密程序,而加密程序也需要我們手動(dòng)編譯一下剧蚣,進(jìn)入tools目錄執(zhí)行make命令即可支竹。如果沒(méi)有報(bào)錯(cuò)旋廷,則擴(kuò)展就全部編譯完成了。
cd tools/
make
然后需要把擴(kuò)展的路徑加入到php.ini中礼搁,你可以把modules/php_screw_plus.so復(fù)制到php擴(kuò)展目錄也可以直接在ini中加入絕對(duì)路徑饶碘,我一般傾向于絕對(duì)路徑這樣修改編譯了擴(kuò)展也不需要重新復(fù)制過(guò)去。
vi php/etc/php.ini
加入絕對(duì)路徑例如
extension=/home/php_screw_plus-1.0/modules/php_screw_plus.so
然后重啟php服務(wù) 這時(shí)可以放個(gè)php文件輸出phpinfo信息馒吴,如果看到以下提示說(shuō)明擴(kuò)展生效了扎运。
下面還有最后一步,加密程序饮戳。
在擴(kuò)展的tools目錄豪治,執(zhí)行./screw [路徑],[路徑]可以是單個(gè)文件也可以是文件夾扯罐,然后就可以實(shí)現(xiàn)加密了负拟。
加密完成后查看源碼,可以發(fā)現(xiàn)除了開(kāi)頭的幾個(gè)英文字符外歹河,其余的都成了亂碼掩浙。
但是打開(kāi)網(wǎng)站,php運(yùn)行正常秸歧,如同沒(méi)有加密一樣厨姚。經(jīng)過(guò)測(cè)試,解密速度大約為100M每秒键菱,對(duì)php自身的性能損失非常小遣蚀,一般不到20毫秒。
screw plus還有個(gè)功能纱耻,可阻止執(zhí)行未經(jīng)許可的php文件,這樣黑客就算上傳了代碼也然并卵险耀。
同樣在php_screw_plus.h里修改弄喘,把STRICT_MODE后面的值改為1,然后make clean && make重新編譯并重啟php甩牺,然后打開(kāi)之前加過(guò)密的網(wǎng)站蘑志,執(zhí)行正常,但是我們隨意上傳個(gè)明文的php文件贬派,結(jié)果是一片空白急但。
原因是未加密的php文件頭部不包含識(shí)別key,擴(kuò)展會(huì)返回空內(nèi)容搞乏,就算黑客獲取了key并加入也沒(méi)用波桩,內(nèi)容會(huì)被解密成亂碼仍然無(wú)法執(zhí)行。經(jīng)過(guò)screw plus的保護(hù)请敦,即使網(wǎng)站整站被下載或被上傳了惡意代碼镐躲,也無(wú)法對(duì)網(wǎng)站造成損失储玫。