问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何对PHP文件进行加密

发布网友 发布时间:2022-04-19 12:51

我来回答

2个回答

懂视网 时间:2022-04-06 08:02

php实现不对称加密的方法:首先创建一个PHP示例文件;然后使用openssl实现非对称加密;最后通过“$rsa = new Rsa('ssl-key');”进行测试即可。

推荐:《PHP视频教程》

PHP实现非对称加密


至于什么是非对称加密,这里就不说啦,大家谷歌去吧。这里说明的是,最近在做一个对外的充值加密服务,那么涉及到这个加密的处理,中间遇到几个小问题,所以记录下,方便自己下次查阅。

详细代码

<?php
/**
 * 使用openssl实现非对称加密
 * 
 * @since 2015-11-10
 */
class Rsa
{
 /**
 * 私钥
 * 
 */
 private $_privKey;
 /**
 * 公钥
 * 
 */
 private $_pubKey;
 /**
 * 保存文件地址
 */
 private $_keyPath;
 /**
 * 指定密钥文件地址
 * 
 */
 public function __construct($path)
 {
 if (empty($path) || !is_dir($path)) {
  throw new Exception('请指定密钥文件地址目录');
 }
 $this->_keyPath = $path;
 }
 /**
 * 创建公钥和私钥
 * 
 */
 public function createKey()
 {
 $config = [
  "config" => 'D:wampinapacheapache2.4.9confopenssl.cnf',
  "digest_alg" => "sha512",
  "private_key_bits" => 4096,
  "private_key_type" => OPENSSL_KEYTYPE_RSA,
 ];
 // 生成私钥
 $rsa = openssl_pkey_new($config);
 openssl_pkey_export($rsa, $privKey, NULL, $config);
 file_put_contents($this->_keyPath . DIRECTORY_SEPARATOR . 'priv.key', $privKey);
 $this->_privKey = openssl_pkey_get_public($privKey);
 // 生成公钥
 $rsaPri = openssl_pkey_get_details($rsa);
 $pubKey = $rsaPri['key'];
 file_put_contents($this->_keyPath . DIRECTORY_SEPARATOR . 'pub.key', $pubKey);
 $this->_pubKey = openssl_pkey_get_public($pubKey);
 }
 /**
 * 设置私钥
 * 
 */
 public function setupPrivKey()
 {
 if (is_resource($this->_privKey)) {
  return true;
 }
 $file = $this->_keyPath . DIRECTORY_SEPARATOR . 'priv.key';
 $privKey = file_get_contents($file);
 $this->_privKey = openssl_pkey_get_private($privKey);
 return true;
 }
 /**
 * 设置公钥
 * 
 */
 public function setupPubKey()
 {
 if (is_resource($this->_pubKey)) {
  return true;
 }
 $file = $this->_keyPath . DIRECTORY_SEPARATOR . 'pub.key';
 $pubKey = file_get_contents($file);
 $this->_pubKey = openssl_pkey_get_public($pubKey);
 return true;
 }
 /**
 * 用私钥加密
 * 
 */
 public function privEncrypt($data)
 {
 if (!is_string($data)) {
  return null;
 }
 $this->setupPrivKey();
 $result = openssl_private_encrypt($data, $encrypted, $this->_privKey);
 if ($result) {
  return base64_encode($encrypted);
 }
 return null;
 }
 /**
 * 私钥解密
 * 
 */
 public function privDecrypt($encrypted)
 {
 if (!is_string($encrypted)) {
  return null;
 }
 $this->setupPrivKey();
 $encrypted = base64_decode($encrypted);
 $result = openssl_private_decrypt($encrypted, $decrypted, $this->_privKey);
 if ($result) {
  return $decrypted;
 }
 return null;
 }
 /**
 * 公钥加密
 * 
 */
 public function pubEncrypt($data)
 {
 if (!is_string($data)) {
  return null;
 }
 $this->setupPubKey();
 $result = openssl_public_encrypt($data, $encrypted, $this->_pubKey);
 if ($result) {
  return base64_encode($encrypted);
 }
 return null;
 }
 /**
 * 公钥解密
 * 
 */
 public function pubDecrypt($crypted)
 {
 if (!is_string($crypted)) {
  return null;
 }
 $this->setupPubKey();
 $crypted = base64_decode($crypted);
 $result = openssl_public_decrypt($crypted, $decrypted, $this->_pubKey);
 if ($result) {
  return $decrypted;
 }
 return null;
 }
 /**
 * __destruct
 * 
 */
 public function __destruct() {
 @fclose($this->_privKey);
 @fclose($this->_pubKey);
 }
}
?>

测试

$rsa = new Rsa('ssl-key');
//私钥加密,公钥解密
echo "待加密数据:segmentfault.com
";
$pre = $rsa->privEncrypt("segmentfault.com");
echo "加密后的密文:
" . $pre . "
";
$pud = $rsa->pubDecrypt($pre);
echo "解密后数据:" . $pud . "
";
//公钥加密,私钥解密
echo "待加密数据:segmentfault.com
";
$pue = $rsa->pubEncrypt("segmentfault.com");
echo "加密后的密文:
" . $pue . "
";
$prd = $rsa->privDecrypt($pue);
echo "解密后数据:" . $prd;

重要问题

这里特别要注意的是在配置中要指定openssl.cnf的文件地址,或者设置个OPENSSL_CONF全局变量就可以了。

热心网友 时间:2022-04-06 05:10

Zend Guard是目前市面上最成熟的PHP源码加密产品。
经过本人搜集资料,亲身测试后,总结了如何利用Zend Guard对PHP文件进行加密,以及如何利用Zend Loader对加密后的PHP文件进行解密。

我使用的是Wampserver2.2,其中php的版本是5.3.10。(注意:这个里面自带的php版本属于TS版本,即Thread safety线程安全)

Zend Guard的安装及破解

点击下载 Zend Guard5.5.0,下载完成后,请自行傻瓜式安装。

破解需要注意以下几点:
  1、本KEY的有效时间为2010年7月10号,因此激活时,请将自己电脑的系统时间调整到这个时间之前,如:2009-01-01
  2、本KEY激活的为试用版,加密过的文件只有14天有效时间,因此在加密文件时,请将自己电脑的系统时间向后调整几年,如:2020-01-01
  3、点击下载授权文件 zend_guard授权文件.zip,解压得到zend_guard.zl,即激活用的文件
  4、打开Zend Guard 5.5.0,[Help] -> [Register] -> [Search for a license file on my disk],选择zend_guard.zl授权文件激活即可
如何使用Zend Guard进行加密?
  1、打开Zend Guard 5.5.0,[File]->[New]->[Zend Guard Project],新建项目。
弹出如下的对话框:

2、点击 Next ,下一步。弹出如下对话框,选择要进行加密的源文件或文件夹。
本步骤是选择要加密的文件,可以是单个文件[Add File]或整个文件夹[Add Folder],然后[Next]。
(此处,我选择的是对整个文件夹进行加密。即 D:\wamp\www\demo 里的所有文件进行加密。)

  3、接下来是选择PHP的版本[与你web服务器上PHP的版本相对照],这里很重要,版本不对会出错,[Finish]完成项目的创建。
注意: 对于Zend Guard 5.5.0这个版本的加密软件,最高只可支持5.3版本的PHP。如果您的PHP版本较高,请到Zend Guard官网下载对应的高版本加密软件。
(由于,我的PHP版本是PHP 5.3.10,故这里我选择PHP 5.3,其他地方可以默认,直接点击完成)

4、在Zend Guard左侧的Guard Explorer中,可以看到你新建的项目了,鼠标选中项目名称后,右键单击[Encode Project],完成。
如此,就实现了对PHP源码的最简单的加密。
我们可以在产品的输出目录(D:\proctDir)里,看到加密后的文件。

可以看出,产品输出目录里的PHP文件已被加密了。

这种最简单的加密方式,我们并没有设置加密的有效期,也没有设置许可证支持(即解密时,是否需要许可证文件),默认是永不过期,不需要解密许可文件。
如果要设置解密时的许可证文件,可以点击 项目名称(project_test) ,再点击 项目主窗口中的 Overview 旁边的 Security 选项卡,就可以进行更加安全的加密设置了。 如下图:

Zend Loader 解密

上面我们已经对PHP代码进行了最简单的加密(编码),加密后生成的PHP源代码,就不能再被web服务器上的PHP模块解析了。
当我们将加密后的php文件放到web服务器上执行时,会显示如下信息:

Zend Guard Run-time support missing!
One more more files on this web site were encoded by ZendGuard and the required run-time support is not installed orproperly configured.
......

原来,加密后的php代码需要ZendGuardLoader模块才能正常运行。
因为我的php版本是5.3.10的,所以我这里只提供了ZendGuardLoader-php-5.3-Windows,如果是其他版本的php,请自行百度。
点击下载 ZendGuardLoader-php-5.3-Windows
下载后,解压压缩包,找到目录里的 ZendLoader.dll 文件,将它复制到你的php目录里的ext目录(PHP的扩展库目录)下,再编辑PHP的配置文件php.ini,添加如下代码:

[Zend.loader],
zend_loader.enable=1
zend_loader.disable_licensing=1
zend_loader.obfuscation_level_support=3
zend_loader.license_path=
zend_extension="d:\wamp\bin\php\php5.3.10\ext\ZendLoader.dll"

注:
zend_loader.enable 表示是否启用zend loader,1表示启用,0表示禁用
zend_loader.disable_licensing 表示是否禁用许可证,1表示禁用,0表示不禁用 (由于上面我加密php文件的时候,没有设置许可证支持,故解密时,禁用许可证)
zend_loader.obfuscation_level_support 表示代码混淆级别
zend_loader.license_path 指定许可证文件的路径
zend_extension 指定zend loader 扩展文件 的路径

配置完成后,重启wampserver,如果您的php的版本是NTS(非线程安全的话),就可以正常执行加密后的PHP文件了。
但是,多数情况下的php版本都是TS(线程安全)的,比如,我这个wampserver集成环境中的php是php-5.3.10-ts,它是没有办法支持Zend Guard Loader扩展文件的。故还会报出上面的错误提示信息。
因为,Zend Guard Loader 只能支持 NTS版本的php,终极解决办法是下载安装 NTS 版本的php。

为了实现PHP源文件的 Zend 解密测试,可以下载安装 php-5.3.29-nts-Win32-VC9-x86,再来配置 Zend Loader 扩展支持。

如何查看安装好的PHP的版本及PHP是否已经成功支持Zend Loader?

通过查看 phpinfo() 函数的输出信息,利用 Ctrl + F 快速查找关键字Thread Safety 和 Zend Guard Loader。
如本人安装好php-5.3.29-nts版本的php后,phpinfo()的输出信息如下:

可以看到,Thread Safety 对应的值为disabled,就说明该php的版本是 NTS (非线程安全)的,否则就是TS版本的。
输出信息中,还可以看到 Zend Guard Loader v3.3 字样,说明 Zend Guard Loader 也安装成功了。
再往下面看,还可以查看 Zend Guard Loader 的配置信息,如下:

到此,整个 Zend Guard 加密和 Zend Guard Loader 解密,就介绍完毕了。

温馨提示: 为了顺利实现PHP代码的zend加密和解密,建议使用PHP官网上主流的PHP的NTS版和Zend官网上对应的Zend Guard加密软件、 Zend Guard Loader解密插件。

相关附件:
Wampserver2.2
Zend
Guard5.5.0
php-5.3.29-nts-Win32-VC9-x86
mod_fcgid-2.3.6-win32-x86.zip
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...这一夜你还会为他熬夜吗?你有什么最想对他说的? 西南大学党委宣传部主要职责 平衡车进水晒干能用吗 平衡车进水了怎么办?可以晒吗? 客厅装修需要哪些电位 遗产继承如何规定 郴州酒店有哪些 郴州最大的酒店排名,郴州市内景区酒店 郴州酒店排名前十名,郴州旅游住酒店推荐 求生欲是什么意思? 翡翠手镯太小怎么戴 翡翠手镯小了怎么戴进去 PHP传值加密 分享如何使用PHP将URL地址参数进行加密传输 PHP的传输数据加密是怎么实现的 源文件格式是什么意思啊? 怎样关闭爱奇艺里面的自动续费 黄金vip会员怎么取消自动续费 黄金vip会员一个月自动续费怎么取消 什么叫源文件? 源文件是什么意思 淘宝子账号怎么删除 淘宝怎么创建子账号 淘宝卖家设置了子账户之后,怎么用子账户登录? 淘宝的子帐号是什么意思 淘宝子账号在手机上用什么登陆? 淘宝子账号为什么接收不到系统消息 淘宝上的子账号,是干什么用的 淘宝怎么申请子账号 淘宝店铺子账号是什么? 淘宝店铺怎么创建多个子账号 什么是淘宝子账号??? PHP如何进行加密 实现数据安全 用php将密码存入数据库,用什么方法进行加密? php excel加密的实现方法有什么 怎么处理php加密的数据 PHP数据加密怎么做,需求看问题补充 php接口怎么加密啊 怎么对PHP文件进行加密 iOS想PHP服务端传数据,怎么加密好 php入门教程 php实现rsa算法,该怎么处理 如何给php代码加密 php有什么加密出来比较短的加密方法 php怎么在post前加密用户名 密码 php做sns游戏需要注意游戏数据传输的加密吗? oppo手机建议买哪款? oppo手机推荐入手哪一款好? oppo手机建议买哪款 目前市面上OPPO手机哪款性价比高,适合购买? 目前oppo手机哪款性价比高? 目前oppo手机哪款性价比高